Puede probar sesiones expiradas comprobando si HttpServletRequest#getRequestedSessionId()
no devuelve null
(lo que significa que el cliente ha enviado una cookie de sesión y asume que la sesión sigue siendo válida) y HttpServletRequest#isRequestedSessionIdValid()
devuelve false
(lo que significa que la sesión ha expirado en el servidor).
En una tuerca:
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);
}
}
No hay necesidad de complicarse con las galletas adicionales. Correlacione este Filter
en un url-pattern
que cubre las páginas protegidas (y excluyendo así las páginas de sesión e inicios de sesión!).
No olvide deshabilitar el almacenamiento en caché de páginas del navegador en las páginas protegidas; de lo contrario, el navegador las cargará de la memoria caché cuando regrese al historial del navegador, en lugar de enviar una nueva solicitud al servidor. Puede lograr esto haciendo lo siguiente en el mismo filtro, antes deChain#doFilter()
llamada.
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.
Gracias. Voy a implementar esto. – Prabhat
si intento recrear una cookie usando el complemento webdeveloper de firefox, el código puede fallar. –