Вы можете проверить сеансы с истекшим сроком действия, проверив наличие HttpServletRequest#getRequestedSessionId()
не возвращает null
(это означает, что клиент отправил файл cookie сеанса и, следовательно, предполагает, что сеанс все еще действителен) и _ 3_ возвращает 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);
}
}
Не нужно возиться с дополнительными файлами cookie. Сопоставьте этот Filter
с url-pattern
, покрывающим защищенные страницы (и, таким образом, исключая страницы с истекшим сроком сеанса и страницы входа!).
Не забудьте отключить кеширование страниц браузером на защищенных страницах, иначе веб-браузер загрузит их из кеша, когда вы вернетесь в историю браузера, вместо того, чтобы отправлять новый запрос на сервер. Вы можете добиться этого, выполнив следующие действия в том же фильтре перед 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.
person
BalusC
schedule
22.07.2010