Как решить ViewExpiredException в JSF 1.2

У меня есть приложение, использующее JSF1.2 + Richfaces 3.3.3 Final, MyFaces 1.2.7, Spring + Hibernate, и я получаю исключение ниже каждый раз, когда очищаю кеш и файлы cookie браузера и снова вхожу в свое приложение.

javax.faces.application.ViewExpiredException - /app/project/index.jsf
Не удалось найти сохраненное состояние представления для идентификатора представления: /app/project/index.jsf

Может ли кто-нибудь сообщить мне, как решить вышеуказанное исключение?


person Kapil Nimje    schedule 29.11.2011    source источник


Ответы (1)


Вы можете решить эту проблему, установив для метода сохранения состояния значение client вместо server, чтобы представления сохранялись (в сериализованной форме, конечно) в скрытом поле ввода формы POST, а не в сеансе на стороне сервера (что является в свою очередь, на них ссылается JSESSIONID cookie; поэтому все представления в основном будут потеряны, когда вы удалите cookie сеанса или когда сеанс истечет). Вы можете сделать это, добавив следующий параметр контекста в web.xml:

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

Если по какой-то причине вышеуказанный вариант не подходит, то лучше всего осторожно обработать его как страницу с ошибкой в ​​web.xml следующим образом:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/errors/sessionexpired.jsf</location>
</error-page>

Это не решает исключение, но, по крайней мере, дает вам возможность сообщить на странице ошибки конечному пользователю о проблеме и о том, какие действия конечный пользователь должен предпринять. Вы даже можете позволить странице с ошибкой указывать на страницу входа и условно отображать некоторое сообщение о том, почему конечный пользователь снова обращается к странице входа.

Смотрите также:

person BalusC    schedule 29.11.2011
comment
Спасибо, Balus за ваш ответ, но мы уже использовали это в нашем приложении, но мы используем серверный метод в случае клиентского метода. Итак, если мы изменим это на клиентский метод, нанесет ли это какой-либо вред моему приложению? ‹Context-param› ‹param-name› javax.faces.STATE_SAVING_METHOD ‹/param-name› ‹param-value› клиент ‹/param-value› ‹/ context-param - person Kapil Nimje; 30.11.2011
comment
Это не нанесет вреда вашему приложению. Только использование полосы пропускания немного увеличится (но не так сильно, если вы включите сжатие GZIP на сервере; вы даже выиграете больше, если еще не настроили сервер для использования сжатия GZIP). - person BalusC; 30.11.2011
comment
Также я пробовал и ниже подход, но в моем случае, когда возникает исключение, оно не перенаправляется на страницу sessionExpired, а по умолчанию перенаправляется на страницу входа. \ n ‹error-page› ‹exception-type› javax.faces.application.ViewExpiredException ‹/exception-type› ‹location› /errors/sessionexpired.jsf ‹/location› ‹/error-page›. - person Kapil Nimje; 30.11.2011
comment
Затем у вас есть еще один <error-page> в web.xml, который имеет более глобальный <exception-type>, который имеет приоритет над ServletException. Вам нужно будет создать Filter, который улавливает ServletException и вместо этого восстанавливает его основную причину. См. Также stackoverflow.com/questions/3206922/ - person BalusC; 30.11.2011