2010-10-07 10 views
13

Ho un sito con un timeout di sessione di 15 minuti. In alcune pagine un utente spende occasionalmente più di 15 minuti compilando una risposta. Qual è la soluzione migliore per mantenere viva la sessione in questo caso?Come mantenere attiva la sessione di un utente mentre sta postando su un forum?

Io uso già JQuery su queste pagine, quindi è possibile eseguire il ping su un server, ma su quali eventi?

Il back-end è un Struts su Tomcat.

+0

15 minuti sembra terribilmente breve. Non potresti semplicemente aumentare il timeout? – Eli

risposta

24

Dato non si desidera cambiare il timeout sessione del sito ..

Impostare un evento di timeout/intervallo (< 15min) in javascript e decidere cosa fare quando l'evento attiva. Se vuoi che la sessione sia attiva fino a quando la pagina è aperta, allora bene, continua a pingare ogni < 15 min. Ma probabilmente non è quello che vuoi, dato che un utente che lascia un computer pubblico dovrebbe essere disconnesso a un certo punto.

È possibile mantenere una variabile lastActivity, che viene aggiornata su ogni documento mousemove o keydown del documento. Se c'è stata un'attività dall'ultimo ping, eseguire nuovamente il ping.

Per essere più sofisticati, è possibile contare gli eventi e eseguire il ping del server solo se il numero di eventi> soglia al timeout.

L'esempio di base:

setInterval(function(){ 
    $.get('/ImStillAlive.action'); 
}, 840000); // 14 mins * 60 * 1000 

Con controllo di base per l'attività digitando:

$(function(){ 
    var lastUpdate = 0; 
    var checkInterval = setInterval(function(){ 
     if(new Date().getTime() - lastUpdate > 840000){ 
      clearInterval(checkInterval); 
     }else{ 
      $.get('/ImStillAlive.action'); 
     } 
    }, 840000); // 14 mins * 60 * 1000 

    $(document).keydown(function(){ 
     lastUpdate = new Date().getTime(); 
    }); 
}); 
+1

Se l'utente fosse abbastanza stupido da andarsene lasciando il browser aperto e connesso, non mi preoccuperei. – casablanca

+0

Grazie, sembra un ottimo modo per farlo. – Nick

0

È possibile impostare un intervallo sempre 5 minuti:

setInterval(function() { 
    // check if a reply textarea is present on the page and focussed 
    // assuming it's e.g. a textarea with the id "reply" 
    if ($('#reply:focussed').length) { 
     // user is still on the reply page 
     // call on a script on the server that renews the session 
    } 
}, 300000);

O controllare se lui/sta ancora digitando qualcosa:

<textarea id="reply"></textarea> 
<input type="hidden" id="reply_length" name="length" />
setInterval(function() { 
    // get length of text in textarea 
    var len = $('#reply').val().length; 

    // get previous length 
    var prev = $('#reply_length').val().length; 

    // if they don't match, assume they're doing something 
    if (len != prev) { 
     // renew session 
    } 

    // update previous length 
    $('#reply_length').val(len); 
}, 300000);
3

Sto pensando che davvero non lo vuoi per TUTTE le pagine però. Se dovessi fare questo su ogni pagina, anche quelle che non dipendono realmente dalle variabili di sessione, consumeresti molta memoria.

Io suggerirei di gettare in una condizione di farlo solo su alcune pagine in cui è necessario, cioè

if (location.href.indexOf('/checkout') !== -1) { 
setInterval(function(){ 
    $.get('/keepalive.action'); 
}, 840000); // 14 mins 
} 
Problemi correlati