Вы можете проверить сеансы с истекшим сроком, проверив, не вернет ли HttpServletRequest#getRequestedSessionId()
null
(что означает, что клиент отправил cookie сеанса и, следовательно, предполагает, что сеанс все еще действителен) и HttpServletRequest#isRequestedSessionIdValid()
возвращает false
(что означает, что сеанс истек на стороне сервера).
В орехе:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
response.sendRedirect(request.getContextPath() + "/sessionexpired.jsp");
} else if (session == null || session.getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
} else {
chain.doFilter(request, response);
}
}
Не нужно суетиться с дополнительным печеньем.Сопоставьте это Filter
с url-pattern
, охватывающим защищенные страницы (и, следовательно, исключая сессии с истекшим сроком действия и страницы входа!).
Не забудьте отключить кэширование страниц браузером на защищенных страницах, в противном случаеwebbrowser загрузит их из кэша, когда вы вернетесь в историю браузера, вместо того, чтобы отправлять новый запрос на сервер.Вы можете достичь этого, выполнив следующие действия в том же фильтре: до Chain#doFilter()
вызова.
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.