Предотвращение исключения ViewExpiredException при нажатии кнопки «Назад» после отмены сеанса - PullRequest
2 голосов
/ 22 мая 2011

Я пытаюсь выяснить, как предотвратить Фиксацию сессии в форме входа в JSF в Glassfish 3.1.Это было легко сделать с сервлетами , поэтому я пытаюсь сделать то же самое с JSF (основываясь на этом вопросе: Получение значения идентификатора сеанса из запроса JSF ):

FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
session.invalidate();   
fCtx.getExternalContext().getSession(true); 

Кажется, что это работает, но когда я нажимаю кнопку "Назад" в браузере и повторно вводю данные для входа, я получаю:

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

Он снова работает только после «обновления» и повторной отправки.

В чем может быть причина этого?

1 Ответ

3 голосов
/ 22 мая 2011

Вы должны указать браузеру , а не кэшировать страницы JSF.Создайте Filter, который отображается как @WebFilter(servletNames={"facesServlet"}) и выполняет следующую работу в методе doFilter()

HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);

. Это заставит браузер запустить новый запрос GET при нажатии кнопки назад.В противном случае он вернул бы только страницу из кэша, и тогда отправка формы не удалась бы, потому что состояние просмотра на стороне сервера было потеряно из-за аннулирования сеанса.

...