Pregunta

Nuestra aplicación se desconecta después de 30 min y se redirige a la página de inicio de sesión,yo soy la especificación de tiempo de espera de sesión en web.xml y el uso de un requestProcessor para redireccionar.Quiero mostrar al usuario un mensaje diciendo que su sesión consiguió vencido una vez que finaliza la sesión,cómo puedo hacer eso.El registro automático de apagado ?Me gustaría preguntar al mensaje de error en la página"La sesión es tiempo de espera, por favor, inicie sesión de nuevo" .Entonces, ¿cómo podría yo detectar la sesión es el tiempo de espera?¿alguno de los métodos de desencadenar automáticamente?

¿Fue útil?

Solución

Crear una actividad de corrector que comprueba cada minuto como si cualquier usuario de la actividad ha tenido lugar (click con el ratón, pulsación de tecla) y realiza un latido del corazón en el lado del servidor para mantener la sesión activa cuando el usuario está activo y no hace nada cuando el usuario no está activo.Cuando no hay actividad en 30 minutos (o lo que sea predeterminado tiempo de espera de sesión se ha fijado en el lado del servidor), a continuación, realizar una redirección.

He aquí un kickoff ejemplo con un poco de ayuda de jQuery para enlazar y haga clic en eventos de pulsación de teclas y el fuego petición 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 un Servlet que se escucha en /heartbeat y lo hace básicamente los siguientes:

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

para mantener activa la sesión.

Cuando se almacena el usuario que ha iniciado sesión en la sesión, que será "automágicamente" la sesión una vez que la sesión caduque.Así que usted no tenga que hacerlo manualmente cierre de sesión del usuario.

Otros consejos

Crear una clase de escucha que implementa HttpSessionListener y defina en Web.xml

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

Ver un ejemplo completo aquí:

http://www.mkyong.COM / SERVLET / A-SIMPLE-HTTPSESSION LISTERENENTE-EJEMPLO: SESIONES ACTIVENTES-CONTADOR /

Cualquiera puede ser simple, servlets, spring-mvc o primavera-seguridad auto desconexión no es posible sin la perfecta lógica del lado del cliente.
Considerando la aplicación tendrá tanto el tipo de solicitud

  • AJAX y
  • presentación de formulario/recargar la página

Auto desconexión necesidades muy calcula la lógica.Presentando mi autologout la funcionalidad de la aplicación con la siguiente

Ventajas.


1.Ninguna llamada extra/solicitud se utiliza para lograr esto.considerando el impacto en el rendimiento si más de 10k de usuarios activos y un extra de llamadas para lograr cerrar la sesión automático.
2.Una línea de configuración usando la etiqueta.
3.Funciona a la perfección, incluso si el usuario abre múltiples pestaña o ventana múltiples.
4.Se sugiere que antes de los 30 segundos de la sesión de invalidación, por lo que si usted llena el formulario y no se presenta, usted puede mantener su sesión activa(extender la sesión por clic).De manera que el usuario menos probabilidades de perder los datos no guardados.

El uso de


1.Incluyen automático de desconexión secuencia de comandos necesarios páginas JSP como se indica a continuación.

    ....
    </body>
    <jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>

2.Crear una página JSP, autologout-script.jsp y añadir a continuación el código. Nota:Edición/configuración es necesaria

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<script>
$(document).ready(function()
{
    var timeOutTimeInSeconds = ${ timeOutTimeInSeconds }; 
    var showTimerTimeInSeconds= ${ showTimerTimeInSeconds };

    var sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
    var timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
    var badgeTimerId;
    window.localStorage.setItem("AjaxRequestFired", new Date());

    function redirectToLoginPage(){
        //location.href =  '<c:url value="/" />'+'${loginPageUrl}';
        window.location.reload();
    }

    $(document).ajaxComplete(function () {
        resetTimer();
    });

    $(window).bind('storage', function (e) {
         if(e.originalEvent.key == "AjaxRequestFired"){
             console.log("Request sent from another tab, hence resetting timer")
             resetTimer();
         }
    });

    function resetTimer()
    {
        showTimerTimeInSeconds= ${ showTimerTimeInSeconds };

        console.log("timeOutTimeInSeconds : "+timeOutTimeInSeconds)
        window.localStorage.setItem("AjaxRequestFired", new Date());

        window.clearInterval(sessionCheckIntervalId);
        sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);

        window.clearInterval(timerDisplayIntervalId);
        timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);

        hideTimer();
    }

    function showTimer()
    {
        $('#sessionTimeRemaining').show();
        $('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
        window.clearInterval(timerDisplayIntervalId);
        badgeTimerId = setInterval(function(){
            $('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
        }, 1000);
    }

    function hideTimer()
    {
        window.clearInterval(badgeTimerId);
        $('#sessionTimeRemaining').hide();
    }
});
</script>

3.Configurar atributos de sesión para configurar el valor de tiempo de espera Nota:Configurar este después de la sesión de la creación.Puede implementar HttpSessionListener sessionCreated método y establecer la siguiente configuración como por su exigencia.

session.setMaxInactiveInterval(300);

session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);

4.Agregar a continuación de html para mostrar el temporizador.
Nota:se puede mover a autologout-script de página de la plantilla, si eres bueno en CSS.Por lo tanto usted puede evitar añadir esto en cada página.
Incluyen bootstrap o añadir css personalizado.

<span class="badge badge-primary" title="click to keep session alive" id="sessionTimeRemaining" 
    onclick="ajaxSessionRefresh()" style="display:none;">
    <i class="badge badge-danger" id="sessionTimeRemainingBadge" style="float:left">30</i>
     &nbsp; 
     <small>Refresh</small>
     <i class="glyphicon glyphicon-refresh"></i>
</span>

enter image description here

Que se trata de un simple auto desconexión de la implementación.Usted puede descargar ejemplo de trabajo de mi repositorio de github
Autologout el uso de simples servlet de ejemplo
Autologout mediante resorte de seguridad de java ejemplo de configuración
Autologout mediante resorte de seguridad de configuración xml de ejemplo

La Lógica Explicó


Caso 1:En la Página de carga
Aquí la lógica es simple, en la página de carga de configurar el temporizador de intervalo equlas a maxInactiveInterval.después de tiempo de espera de redirigir a la página de inicio de sesión.
Caso 2:Mantener un seguimiento de las llamadas AJAX
Ahora teniendo en cuenta peticiones AJAX, usted puede utilizar .ajaxStart() o .ajaxComplete() devoluciones de llamada de jquery, de modo que si cualquier petición ajax es despedido puede restablecer el intervalo.
Caso 3:Seguimiento de múltiples pestaña/ventana de actividad
Intertab de la comunicación se hace para sincronizar el estado de cada ficha.Utiliza localStorage en el evento de cambio.

Limitaciones y/o Mejoras requeridas
1.Si el máximo permitido de la sesión es de uno, si la sesión es tomado de otro sistema, petición AJAX fallará.Se necesita ser manejado para redirigir a la página de inicio de sesión.
2.Uso ajaxStart() en lugar de ajaxComplete() para tener la exacta sincronización de idleTime valores entre el servidor y el navegador.

Requisitos
1.Jquery

Alternativas a la actual implementación en comparación


1. Configuración de la Actualización de encabezado en respuesta http. (No funciona para las peticiones AJAX)

response.setHeader("Refresh", "60; URL=login.jsp");
  1. Ajuste de la meta etiqueta de actualización en HTML (No funciona para las peticiones AJAX)
<meta http-equiv="refresh" content="60; url=login.jsp">
  1. La configuración de la Actividad corrector Mantiene sesión vivo por repetir la petición AJAX.Pistas de tiempo de inactividad y hace la petición de desconexión después de tiempo de espera.
    Se trata sin duda de una buena con la simple lógica.Pero sólo quiero que me la tinta de mis observaciones.
    • Impacto en el rendimiento si 2 de las solicitudes son realizadas por minuto para mantener la sesión activa y 50k de usuarios activos.De 100 mil solicitudes por minuto.
    • Intertab de comunicación Si dos pestañas abiertas, una ficha está recibiendo la actividad, pero otra pestaña no está recibiendo la actividad, que ficha incendios petición de desconexión e invalidar la sesión, aunque la actividad está presente en la ficha otros.(Pero puede ser manejado)
    • La fuerza de cierre de sesión enfoque Es un cliente está dominada por el servidor para invalidar la sesión.

Si está utilizando sesiones de servlet, puede verificar si la sesión el JSP / Servlet está regresando es nuevo con el método ISNEW ().En caso afirmativo, entonces la sesión del usuario ha caducado y puede mostrar los mensajes relevantes.

Incluya una función de utilidad JavaScript dentro de su JSP y haga ping al servidor cada 31 minutos. La función de utilidad mencionada anteriormente debe estar usando Settimeout () la función JS internamente.

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

Nota que

CheckServerssession ()

es una función regular de JS que puede incidir las solicitudes de HTTP.Si la solicitud es exitosa, la sesión existe de otra manera, muestra el mensaje al usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top