Помимо истечения срока действия сеанса, какие другие условия могут вызвать ViewExpiredException?
Конечный пользователь запросил / создал слишком много представлений в течение сеанса и отправляет в старое представление. Максимальное число просмотров на сеанс по умолчанию - 15. Другими словами, если конечный пользователь открывает 16 окон / вкладок браузера на странице с формой в пределах одного сеанса и отправляет первый, то пользователь может получить ViewExpiredException
.
Максимальное количество просмотров за сеанс настраивается в web.xml
на
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>15</param-value>
</context-param>
См. Также Мохарра FAQ для других параметров.
Есть ли способ ввести дополнительное ведение журнала, чтобы выяснить особую ситуацию, которая вызывает это исключение в каждом случае?
Не через JSF и / или ViewExpiredException
. Целое исключение просто означает, что представление больше не присутствует в сеансе. Это, в свою очередь, может иметь более серьезные причины. Может помочь регистрация создания и уничтожения сеанса с помощью HttpSessionListener
и регистрация изменений атрибута сеанса с помощью HttpSessionAttributeListener
.
Обновление в соответствии с комментариями, нажатие кнопки «Назад» в браузере на кэшированной странице, содержащей форму, и последующая отправка формы после нее может также действительно вызвать ViewExpiredException
, когда срок действия представления истек. Это может быть решено следующими двумя способами, предпочтительно в их комбинации:
- Поручить браузеру не кэшировать страницы.
- Не не использовать формы POST для простой постраничной навигации.
Подробнее см. этот ответ .