2010-07-22 14 views
6

Caso 1: Cerrar sesión: una vez que finalice la sesión, si se intenta acceder a anterior, debe redireccionar automáticamente a login.jsp¿Cómo diferenciar entre el cierre de sesión y la sesión expirada?

Caso 2: sesión expirada: si la sesión caduca cuando el usuario todavía está conectado, debe intente redirigir automáticamente a sessionExpired.jsp cuando se accede a la página anterior.

¿Cómo diferenciar? Actualmente estoy invalidando la sesión al cerrar la sesión.

Respuesta

8

el inicio de sesión, establezca una cookie con un vencimiento prolongado (> 24 horas). Elimine esta cookie en el tiempo de cierre de sesión configurando maxage en 0.

Puede tener control para cualquier usuario que no haya iniciado sesión (es decir, id de sesión no válida). Si no existe la cookie, redirigir a él login.jsp

Si existe la cookie, significa que su sesión ha finalizado por lo que le redirija a la sesión-expired.jsp

+0

Gracias. Voy a implementar esto. – Prabhat

+0

si intento recrear una cookie usando el complemento webdeveloper de firefox, el código puede fallar. –

1

Si fuera yo, borraría la sesión al cerrar la sesión y crearía un bool llamado HasLoggedOut y luego establecería esto en verdadero. Entonces, si este bool existe en la sesión, usted sabe que se desconectó, si no lo hace, la sesión se ha agotado o el usuario nunca ha iniciado sesión.

Como todavía no puede diferenciar entre cronometrado y no cerrar sesión que normalmente tomar la decisión que si solicitan una página autenticado sólo voy a enviarlas a la página de tiempo de espera de sesión que también funciona como una página de inicio de sesión que dice algo así como

"Vaya, no sabemos quién es usted, ya sea en su sesión ha caducado o aún no se ha identificado, por favor ingresa abajo"

Esto entonces atiende a ambos escenarios

+0

Gracias. Es una buena idea, sin embargo, mostrar que eres un nuevo usuario o que se agotó el tiempo de espera de la sesión no se ve bien. – Prabhat

7

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. 
+0

Si estoy redireccionando de una página a otra, por ejemplo, ingrese la página de tipo de inicio de sesión (seleccione inicio de sesión de google o inicio de sesión predeterminado) para ingresar, ambos ocurren antes de iniciar sesión, ¿el código anterior redirige a la página de sesión expirada? – Dileep

+0

Entiende la respuesta anterior, pero ¿qué pasará si implementamos el mecanismo de autenticación básica http ... antes de acceder a cualquier url o servlet del lado del servidor arrojará 401 al cliente ... cómo manejarlo en este caso? –

+0

Simplemente reemplace por la autenticación FORM si desea un control más detallado. – BalusC

Cuestiones relacionadas