ViewExpiredException после обновления до jsf2 - PullRequest
5 голосов
/ 11 апреля 2011

Недавно мы обновили основную платформу с jsf 1.2 до 2.0.После обновления мы получаем несколько ошибок ViewExpiredException каждый час.Из прочтения этой темы кажется, что это ожидаемое исключение, когда сеансы истекают, однако мы просмотрели журналы доступа и получаем эти исключения, даже если запросы в некоторых случаях разнесены всего на 5 минут.

У меня следующие вопросы:

1) Какие другие условия могут вызвать исключение ViewExpiredException?

2) Исключение, которое мы регистрируем, не содержит подробных сведений о точном состоянии, которое вызывает исключение (пропущенный сеанс, поврежденный сеанс, невозможно восстановить определенный компонент).Есть ли способ ввести дополнительное ведение журнала, чтобы выяснить особую ситуацию, которая вызывает это исключение в каждом случае?

Mojarra 2.0.4-b09 Tomcat 6 Использование Memcached Session Manager для репликации сеанса

Любая помощь приветствуется.Спасибо!

1 Ответ

5 голосов
/ 11 апреля 2011

Помимо истечения срока действия сеанса, какие другие условия могут вызвать 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 для простой постраничной навигации.

Подробнее см. этот ответ .

...