ViewExpiredException на целевой странице приложения JSF - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть приложение, созданное с использованием JSF1.2.У меня есть домашняя страница с набором командных ссылок.После того, как я разверну приложение, когда открою домашнюю страницу и нажму на любую из этих ссылок меню - я получаю следующее исключение.Однако если я перейду на другие страницы и вернусь на страницу и нажму на любую из ссылок, соответствующая страница откроется.

javax.faces.application.ViewExpiredException: viewId: / home / home.jsf - Просмотр /home/home.jsf не может быть восстановлен.

web.xml имеет фильтр ниже -

 <filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
    <init-param>
      <param-name>createTempFiles</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>maxRequestSize</param-name>
      <param-value>100000</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Это может произойти, если страница действительно загружена из кеша браузера или если ваше веб-приложение где-то делает недействительным сеанс после ответа на самый первый запрос.Поскольку последний подход довольно странный, я подозреваю, что это просто кеш браузера.Вам нужно создать фильтр, чтобы браузер не кэшировал запросы JSF.Фильтр должен быть сопоставлен с <servlet-name> из FacesServlet и выполнять следующую работу в методе doFilter():

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse res = (HttpServletResponse) response;
    res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    res.setDateHeader("Expires", 0); // Proxies.
    chain.doFilter(request, response);
}

Не забудьте очистить кеш браузера перед тестированием веб-приложения с новымфильтр.

См. также:


Не связано к конкретной проблеме, у вас есть главная проблема проектирования: вы используете командные ссылки для выполнения постраничной навигации.Там они не для.Командные ссылки должны использоваться для отправки формы.Вы должны использовать <h:outputLink> или обычные элементы HTML <a> для постраничной навигации.Таким образом, страницы будут добавлены в закладки, searchbot-indexable, и URL в адресной строке браузера больше не будет «на шаг позади».См. Также Когда мне следует использовать h: outputLink вместо h: commandLink?

1 голос
/ 03 апреля 2012

Это не ошибка - это особенность JSF. Это происходит, когда ваша страница простаивает в течение некоторого времени, поэтому срок действия представления истекает. Есть много обходных путей для этого. Попробуйте прочитать этот очень хороший пост: JSF Odyssey - ViewExpiredException

Надеюсь, это поможет.

...