, когда сессия заканчивается, и если пользователь нажимает кнопку "Назад", он получает страницу со всеми стилями
Вы должны сказать браузеру некешировать страницы в кеше браузера.Браузер должен вместо этого отправлять полный запрос на сервер.
Добавьте следующие строки прямо перед filterChain.doFilter()
вызовом.
if (!httpServletRequest.getRequestURI().startsWith(httpServletRequest.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
httpServletResponse.setDateHeader("Expires", 0); // Proxies.
}
Если сеанстайм-аут, и я нажимаю на нумерацию страниц, после чего сообщение об окончании сеанса не появляется.Кажется, что ajax-запрос не вызывает фильтра?
JSF-ajax-запросы ожидают XML-ответов с HTTP-статусом 200. Если вы отправляете синхронное перенаправление, то HTTP-статус 302 будет отправленкоторый будет полностью игнорироваться движком JSF ajax.Вместо этого вы должны отправлять нормальный ответ HTTP 200 с определенным фрагментом XML, который указывает движку JSF ajax выполнить перенаправление.Сделайте это вместо httpServletResponse.sendRedirect()
, затем:
if ("partial/ajax".equals(httpServletRequest.getHeader("Faces-Request"))) {
httpServletResponse.setContentType("text/xml");
httpServletResponse.getWriter()
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
.printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", timeoutPage);
}
else {
httpServletResponse.sendRedirect(timeoutPage);
}
Обратите внимание, что когда вы уже находитесь в контексте JSF (например, PhaseListener
или SystemEventListener
или, возможно, @ManagedBean
), тогда вы можете простоиспользуйте метод ExternalContext#redirect()
.Соответственно, он будет прозрачно обрабатывать синхронные / асинхронные запросы.