2009-02-21 32 views
6

Suponga que está haciendo una aplicación bancaria. Si los usuarios inician sesión en su sitio, ¿cómo detectar su inactividad y pedirles que cierren sesión si permanecen inactivos durante un período de tiempo? Inactivo aquí significa que han cambiado a otras pestañas o que no tocan la aplicación del navegador.Forzar el cierre de sesión de los usuarios si los usuarios están inactivos durante un cierto período de tiempo

Supongo que creo que puedo hacer esto registrando cada movimiento del mouse o movimiento del teclado cuando los usuarios están haciendo en CADA página de mi aplicación. Pero el código sería muy feo y difícil de mantener. ¿Hay otras maneras más elegantes de hacer esto?

+0

¿Qué quiere decir cerrar la sesión? – Gumbo

+0

Cambié la pregunta para que quede más clara. – Graviton

+0

@Gumbo Logout => Invalidar la autenticación de usuario –

Respuesta

6

Si el usuario está solicitando nuevas páginas/datos de su servidor de forma regular, entonces ajustar el tiempo de espera de la sesión en PHP debería funcionar para esto (suponiendo que esté usando sesiones de PHP).

Si la preocupación es que podrían estar sentados en una página durante un buen período de tiempo sin viajes al servidor (por ejemplo, rellenando un formulario largo), y desea distinguir entre esto y el usuario simplemente cambiando a En otra ventana, podría hacer algo como usar javascript para solicitar datos usando XMLHTTPRequest cada cinco minutos para mantener viva la sesión. Puede usar los eventos window.focus y window.onblur en javascript para detener y reiniciar este mecanismo (creo que hay algunas diferencias para IE, hay una buena explicación here).

0

Por lo general, la duración de la sesión se utiliza para determinar si un usuario está conectado o no. Entonces, podría establecer un indicador en la sesión que representa este estado. Y si falta (o el usuario aún no se conectó o la sesión se agotó), se considera que no inició sesión.

1

Depende de cómo están "conectados" en primer lugar. ¿La caducidad de la sesión en el servidor no lo hace por usted? Si realmente desea hacerlo de forma manual, entonces podría utilizar algo de JavaScript en un setTimeout, pero eso es feo

4

una manera muy fácil y eficaz de hacer esto es mediante la colocación de algo como esto en su sección HEAD de HTML:

<META HTTP-EQUIV="refresh" CONTENT="1800;URL=logout.php?timeout"> 

Reemplace el tiempo de espera de logout.php? Con el script apropiado .. En el ejemplo anterior, si? Timeout está en la cadena de consulta, les muestro una página de inicio de sesión con información que indica que han sido desconectados por inactividad.

Reemplace 1800 con el tiempo en segundos que desea permitir que permanezcan inactivas antes de cerrarlas automáticamente. Establezca esto al mismo tiempo que tiene establecida la caducidad de la sesión.

Editar - Otro mecanismo fácil de implementar es tener una variable de sesión llamada last_time, o last_activity, o algo similar, y configurarlo en una marca de tiempo cada vez que haya actividad. En la mayoría de mis cosas, tengo un archivo de inclusión general en el que hago esto. En el mismo archivo, puede verificar para asegurarse de que esté dentro de las restricciones que ha establecido para una sesión activa. Si ha sido demasiado largo, simplemente haga un redireccionamiento de 300 a la página de cierre de sesión y muestre el mensaje de inactividad apropiado allí.

¡Buena suerte!

Ian

+0

Esto supondría que una ventana activa del navegador está abierta. – Sam152

+0

Si tiene el tiempo de espera de la sesión configurado al mismo tiempo de redireccionamiento, entonces no importa si tiene una ventana del navegador activa. –

+5

Este es un método realmente duro, si estuviera escribiendo un correo electrónico, y me tomó más tiempo que el tiempo de espera, ¡simplemente arruinaría mi trabajo! Haga esto 2 veces y no volveré al sitio empleando este método. – Jacco

0

Usted puede tener un poco de javascript que comprueba el servidor cada x minutos para ver si la última actividad del usuario era. No debería haber más que unas pocas líneas de código. También agregaría una meta actualización si el usuario tiene javascript deshabilitado.

13

Hola chicos este es el código que uso. No es mío, pero lo modifiqué a su 'perfección'.

// Add the following into your HEAD section 
var timer = 0; 
function set_interval() { 
    // the interval 'timer' is set as soon as the page loads 
    timer = setInterval("auto_logout()", 10000); 
    // the figure '10000' above indicates how many milliseconds the timer be set to. 
    // Eg: to set it to 5 mins, calculate 5min = 5x60 = 300 sec = 300,000 millisec. 
    // So set it to 300000 
} 

function reset_interval() { 
    //resets the timer. The timer is reset on each of the below events: 
    // 1. mousemove 2. mouseclick 3. key press 4. scroliing 
    //first step: clear the existing timer 

    if (timer != 0) { 
    clearInterval(timer); 
    timer = 0; 
    // second step: implement the timer again 
    timer = setInterval("auto_logout()", 10000); 
    // completed the reset of the timer 
    } 
} 

function auto_logout() { 
    // this function will redirect the user to the logout script 
    window.location = "your_logout_script.php"; 
} 

// Add the following attributes into your BODY tag 
onload="set_interval()" 
onmousemove="reset_interval()" 
onclick="reset_interval()" 
onkeypress="reset_interval()" 
onscroll="reset_interval()" 

Goo suerte

Richard

3

Podemos mejorar nuestros códigos para jQuery ahora


idleTime = 0; 
$(document).ready(function() { 

    var idleInterval = setInterval("timerIncrement()", 60000); // 1 minute //60000 
    $(this).mousemove(function(e) { 
     idleTime = 0; 
    }); 
    $(this).keypress(function(e) { 
     idleTime = 0; 
    }); 

}); 

function timerIncrement() { 

    idleTime = idleTime + 1; 

    if (idleTime >= 5) { 
     window.location = $('#base_url').val() + 'home/logout_user'; 
    } 
} 

2

usted puede hacerlo más elegante con underscore y jquery javascript bibliotecas-

$('body').on("click mousemove keyup", _.debounce(function(){ 
    // logout user here 
}, 1800000)) // 30 minutes inactivity 
0

Tomé la marca de tiempo 'ahora' y comprobar en cada clic, si el retraso es inferior a 3000 segundos o más de mil millones de segundos, lo que significa que el usuario acaba de conectarse, si no es redirigirá a la salida de sesión

var time = 0; 

$(document).on('click', function() { 

    var now = Date.now()/1000 | 0; 

    if (now - time < 3000 || now - time > 1480000000) { 
     time = now; 
    } else { 
     window.location.replace("http://url"); 
    } 
}) 
Cuestiones relacionadas