Ответ 1
По умолчанию кнопка "Назад назад" не отправляет HTTP-запрос на сервер вообще. Вместо этого он извлекает страницу из кеша браузера. Это по сути безвредно, но действительно запутывает конечного пользователя, потому что он/она неправильно думает, что он действительно приходит с сервера.
Все, что вам нужно сделать, - это указать браузеру не кэшировать ограниченные страницы. Вы можете сделать это с помощью простого фильтра сервлета, который устанавливает соответствующие заголовки ответов:
@WebFilter
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
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);
}
// ...
}
(обратите внимание, что этот фильтр пропускает запросы ресурсов JSF, чье кэширование необходимо настроить отдельно)
Чтобы запустить его для каждого запроса JSF, задайте следующую аннотацию в классе фильтра, считая, что значение <servlet-name>
для FacesServlet
в вашем webapp web.xml
равно FacesServlet
:
@WebFilter(servletNames={"facesServlet"})
Или, чтобы заставить его работать только по определенному шаблону URL-адреса, например, соответствующему узлам с ограничениями, например. /app/*
, /private/*
, /secured/*
, или так, установите в классе фильтра следующую аннотацию:
@WebFilter("/app/*")
Вы даже можете выполнить ту же самую работу в фильтре, который проверяет зарегистрированного пользователя, если у вас его уже есть.
Если вы используете библиотеку служебных программ JSF OmniFaces, вы также можете просто захватить ее CacheControlFilter
. Это также прозрачно учитывает ресурсы JSF.