Тот факт, что вы видите предыдущие страницы, когда пользователь нажимает кнопку «Назад» браузера, указывает, что страницы были кешированы и отображаются в кеше браузера, а не на сервере. Чтобы исправить это, вам необходимо правильно настроить заголовки HTTP-ответов. На это был дан ответ заранее в Making sure a web page is not cached, across all browsers. Просто повторить BalusC, это:
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.
Наиболее подходящее место для установки этих заголовков является веб-фильтр, как вы, кажется, не нужны какие-либо из JSF вещей там. Вы можете найти дополнительную информацию в ответах на вопрос Avoid back button on JSF web application. Чтобы повторить код BalusC, вы получите:
@WebFilter("/secured/*")
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, как иметь дело с уже открытыми страницами, когда сеанс был признан недействительным/тайм-аутом. Другими словами, как вы можете иметь дело с ViewExpiredException
. Это, в свою очередь, отвечает в How to handle session expiration and ViewExpiredException in JSF 2? и javax.faces.application.ViewExpiredException: View could not be restored для синхронных запросов POST и в Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request для запросов AJAX.
В принципе, для первых вам нужно добавить следующие строки в web.xml:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/expired.xhtml</location>
</error-page>
Для последнего я горячо рекомендую вам взглянуть на полезную библиотеку JSF OmniFaces и его FullAjaxExceptionHAndler, который был предназначенные для этой цели.
Возможный дубликат кнопки [Избегайте возврата на веб-приложение JSF] (http: // stackoverflow.com/questions/10305718/avoid-back-button-on-jsf-web-приложение) – BalusC
Спасибо большое @BalusC, но все же мой вопрос не является точно кэшированными страницами при нажатии кнопки «Назад», но на кешированных страницах, почему действие выполняется при нажатии из командной кнопки, если я аннулирую сессию –