Ответ 1
когда сеанс истекает, и если пользователь нажимает кнопку "Назад", он получает страницу со всем стилем
Вам нужно сообщить браузеру, что он не кэширует страницы в кеше браузера. Браузер shoud вместо этого отправляет полный запрос на сервер.
Добавьте следующие строки непосредственно перед вызовом 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, который будет полностью проигнорирован механизмом ajax JSF. Вместо этого вы должны отправлять обычный ответ HTTP 200 с определенным фрагментом XML, который сообщает JAF 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()
. Он будет прозрачно обрабатывать синхронные/асинхронные запросы соответственно.