Обработка просроченного ViewState в JSF и Richfaces

У меня есть страницы регистрации серии, которые основаны друг на друге. Когда сеанс пользователя истекает, у меня есть Слушатель, который очищает все на сервере, и это прекрасно работает. Но если пользователь пытается сделать что-то еще, я просто хочу перенаправить их обратно на первую страницу серии. Тем не менее, мой фильтр, кажется, не работает правильно. Я продолжаю получать javax.faces.application.ViewExpiredException

Какова лучшая практика для обработки этого исключения? Я не могу просто обработать файл web.xml, потому что это слишком глобально. Кроме того, страница "Ошибка" отображается из некоторого кода JSF - мне кажется, мне нужно уловить, что это происходит с использованием PhaseListener, поэтому исключение не возникает в первую очередь, но я не смог найти хорошую модель как это сделать. Есть идеи?

5 ответов

Richfaces имеет собственный механизм для обработки исключений ViewExpiredException, посмотрите документы Richfaces.

Я думаю, что вы правильный трек с фазовым слушателем. По сути, настроить что-то в сессии на первой странице. Затем в фазе слушателя ищите значение в сеансе. Если он не выходит, сделайте перенаправление. Хитрость заключается в том, чтобы сделать это на ранней стадии процесса прослушивания фазы. Не уверен точно, где в процессе ваш слушатель фазы выдает исключение.

Чтобы справиться с этим, нужно добавить фильтр в файл web.xml, сопоставленный только с URL-адресами, которые вы хотите отслеживать. Этот фильтр проверяет, истек ли сеанс, и затем перенаправляет на страницу входа, если это так. Он должен работать, если фильтр запускается до запуска любого кода JSF.

В прошлом я справился с этим, используя слушателя, который проверяет поле в управляемом сессионном компоненте. Если время сеанса пользователя истекает, слушатель очищает mbean и помечает пользователя как не вошедшего в систему. Каждый запрос отправляется через слушателя, и если требования не выполняются, то пользователь вынужден покинуть сайт. Я никогда не получаю ViewExpiredException в моем журнале. Единственное время, когда это исключение произошло, - это если сервер был перезапущен, и пользователь запрашивает страницу при наличии предыдущего активного сеанса.

Вы можете проверить, является ли ваша сессия недействительной или нет

логический sessionInValid = httpServletRequest.getRequestedSessionId()!= null &&!httpServletRequest.isRequestedSessionIdValid();

Здесь логическая переменная sessionInValid будет возвращать true, если сессия каким-либо образом недействительна.

Вы можете добавить это в фильтр или прослушиватель, а затем настроить это в своем файле web.xml.

Другие вопросы по тегам