2010-07-08 18 views
5

Nuestra aplicación se cierra después de 30 minutos y se redirige a la página de inicio de sesión, estoy especificando tiempo de espera de sesión en web.xml y utilizando un requestProcessor para redirigir. Quiero mostrar al usuario un mensaje que dice Su sesión expiró una vez que la sesión expira, ¿cómo puedo hacer eso? ¿Cerrar sesión automáticamente? Me gustaría mostrar el mensaje de error en la página "La sesión ha expirado, vuelva a iniciar sesión". Entonces, ¿cómo podría detectar que la sesión ha expirado? ¿Se disparará cualquier método automáticamente?Cierre de sesión automático una vez que la sesión caduque

Respuesta

9

Crea un comprobador de actividad que comprueba cada minuto si ha tenido lugar alguna actividad del usuario (clic del mouse, tecla) y realiza un latido del servidor para mantener activa la sesión cuando el usuario está activo y no hace nada cuando el usuario no está activo. Cuando no hay actividad durante 30 minutos (o lo que sea que el tiempo de espera predeterminado de la sesión se haya establecido en el servidor), realice una redirección.

Aquí hay un ejemplo de kickoff con poca ayuda de jQuery para vincular los eventos de clic y pulsación de tecla y disparar la solicitud de ajax.

<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script> 
    $(document).ready(function() { 
     $.active = false; 
     $('body').bind('click keypress', function() { $.active = true; }); 
     checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute. 
    }); 

    function checkActivity(timeout, interval, elapsed) { 
     if ($.active) { 
      elapsed = 0; 
      $.active = false; 
      $.get('heartbeat'); 
     } 
     if (elapsed < timeout) { 
      elapsed += interval; 
      setTimeout(function() { 
       checkActivity(timeout, interval, elapsed); 
      }, interval); 
     } else { 
      window.location = 'http://example.com/expired'; // Redirect to "session expired" page. 
     } 
    } 
</script> 

Crear una Servlet que escucha en /heartbeat y hace básicamente lo siguiente:

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
    request.getSession(); 
} 

para mantener la sesión activa.

Cuando almacena al usuario que ha iniciado sesión en la sesión, se cerrará "automágicamente" cada vez que expire la sesión. Por lo tanto, no es necesario cerrar la sesión manualmente del usuario.

+0

Quiero que se muestre el mensaje de alerta después de 30 minutos, ¿cómo puedo alterar la secuencia de comandos anterior, he definido el tiempo de espera de la sesión en web.xml – sarah

+0

Este script muestra la ventana emergente incluso si la aplicación está en uso. – sarah

+0

Eso puede suceder cuando hay varias ventanas abiertas en la misma sesión. Fue un ejemplo básico de patada de salida. Tendrá que dar algunos pasos más. Realice sondeos ajaxical en el servidor para mantener la sesión activa mientras el usuario esté activo. Puede encontrar un ejemplo en [esta otra respuesta mía] (http://stackoverflow.com/questions/2319020/mvc-with-jquery-handling-session-expire/2319211#2319211). – BalusC

0

Si está utilizando sesiones servlet, puede verificar si la sesión que devuelve el jsp/servlet es nueva utilizando el método isNew(). Si es así, entonces la sesión del usuario ha expirado y puede mostrar los mensajes relevantes.

+0

mensaje de expiración de la sesión del usuario debe mostrarse solo después del tiempo de espera, en su caso se mostrará incluso después de cerrar la sesión, que no necesito – sarah

2

crear una clase de escucha de la implementación de HttpSessionListener y definirlo en web.xml

Esto le notificará cuando cualquier sesión se destruye. Use el método sessionDestroyed().

Véase un ejemplo completo aquí:

http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/

+1

La solución anterior no obligará al navegador a mostrar un cuadro de diálogo. –

+0

La solución anterior forzará a la aplicación a solicitar el mensaje incluso después de cerrar sesión, no comprobará el tiempo de caducidad, digamos 30 minutos y mostrará el mensaje – sarah

0

Incluir una función de utilidad javascript dentro de su JSP y ping al servidor cada 31 minutos. La función de utilidad mencionada anteriormente debe usar la función JT setTimeout() internamente.

setTimeout ("checkServerSession()", /* intervalInMilliSeconds */ 31000); 

Tenga en cuenta que

checkServerSession()

es una función regular JS que puede disparar las peticiones HTTP. Si la solicitud es exitosa, la sesión existe; de ​​lo contrario, muestre la solicitud al usuario.

+0

Déjeme saber un ejemplo, cómo puede funcionar esto – sarah

Cuestiones relacionadas