2009-02-21 21 views
6

Si supponga di eseguire un'applicazione bancaria. Se gli utenti sono collegati al tuo sito, come rilevare la loro inattività e chiedere loro di disconnettersi se rimangono inattivi per un periodo di tempo? Inattivo qui significa che possono passare ad altre schede o non toccare l'applicazione browser.Forza disconnessione utenti se gli utenti sono inattivi per un determinato periodo di tempo

Immagino di poterlo fare registrando tutti i movimenti del mouse o della tastiera quando gli utenti eseguono su OGNI pagina della mia applicazione. Ma il codice sarebbe molto brutto e difficile da mantenere. Esistono altri modi più eleganti per farlo?

+0

Cosa intendi per disconnessione? – Gumbo

+0

Ho cambiato la domanda in modo che sia più chiara. – Graviton

+0

@Gumbo Logout => Invalida l'autenticazione dell'utente –

risposta

6

Se l'utente richiede regolarmente nuove pagine/dati dal server, la regolazione del timeout della sessione in PHP dovrebbe funzionare per questo (presupponendo che si stiano utilizzando sessioni PHP).

Se la preoccupazione è che potrebbero stare seduti su una pagina per un buon periodo di tempo senza viaggi sul server (ad esempio compilando un modulo lungo) e si desidera distinguere tra questo e l'utente semplicemente passando a un'altra finestra, potresti fare qualcosa di simile a usare javascript per richiedere alcuni dati usando XMLHTTPRequest ogni cinque minuti circa per mantenere viva la sessione. Potresti usare gli eventi window.focus e window.onblur in javascript per fermare e riavviare questo meccanismo (penso che ci siano alcune differenze per IE, c'è una buona spiegazione here).

0

Di solito la durata della sessione viene utilizzata per determinare se un utente ha effettuato l'accesso o meno. Quindi puoi impostare un flag nella sessione che rappresenta questo stato. E se manca (o l'utente non ha ancora effettuato l'accesso o la sessione è scaduta), viene considerato come non connesso.

1

In base al modo in cui sono "registrati" in primo luogo. La scadenza della sessione sul server non fa questo per te? Se si vuole veramente farlo manualmente, allora si potrebbe usare un po 'di javascript in un setTimeout, ma questo è brutto

4

Un modo molto semplice ed efficace per farlo è mettendo qualcosa di simile nella vostra sezione HEAD HTML:

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

Sostituire il timeout logout.php con lo script appropriato. Nell'esempio precedente, se il timeout è nella stringa della query, visualizzo una pagina di accesso con informazioni che indicano che sono state disconnesse a causa di inattività.

Sostituire 1800 con il tempo in secondi in cui si desidera consentire loro di rimanere inattivi prima di effettuare automaticamente la disconnessione. Impostalo nello stesso momento in cui hai impostato la scadenza della sessione.

Modifica: un altro semplice meccanismo da implementare consiste nell'avere una variabile di sessione chiamata last_time o last_activity o qualcosa del genere lungo queste righe e impostarla su un timestamp ogni volta che si verifica un'attività. Nella maggior parte delle mie cose, ho un file di inclusione generale in cui lo faccio. Nello stesso file, puoi verificare che rientri nei limiti stabiliti per una sessione attiva. Se è troppo lungo, esegui il reindirizzamento 300 alla pagina di disconnessione e visualizza lì il messaggio di inattività appropriato.

Buona fortuna!

Ian

+0

Ciò presuppone che sia aperta una finestra del browser attiva. – Sam152

+0

Se il timeout della sessione è impostato sullo stesso orario del reindirizzamento, non importa se si dispone di una finestra del browser attiva. –

+5

Questo è un metodo davvero duro, se stavo scrivendo una e-mail, e mi ci è voluto più tempo per il tuo periodo di timeout, avresti semplicemente spazzato via il mio lavoro !? Fai questo 2 volte e non tornerò al sito utilizzando questo metodo. – Jacco

0

Si può avere un po 'di javascript che controlla il server ogni x minuti per vedere l'ultima volta che l'attività dell'utente era. Non dovrebbe essere più di poche righe di codice. Vorrei anche aggiungere un meta refresh se l'utente ha disabilitato javascript.

13

Ciao Ragazzi, questo è il codice che uso. Non è mio, ma l'ho modificato per la sua "perfezione".

// 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 fortuna

Richard

3

Siamo in grado di migliorare i nostri codici di jQuery ora


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

si può fare più elegantemente con underscore e jquery javascript libraries-

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

ho preso il timestamp 'ora' e controllo su ogni clic se il ritardo è inferiore a 3000 secondi o più di miliardi di secondi, il che significa che l'utente appena effettuato l'accesso, se non è reindirizzerà per disconnettersi

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"); 
    } 
}) 
Problemi correlati