2010-10-07 9 views
13

J'ai un site avec un délai d'expiration de session de 15 minutes. Sur certaines pages, un utilisateur passe parfois plus de 15 minutes à remplir une réponse. Quelle est la meilleure solution pour maintenir vivante la session dans ce cas?Comment maintenir en vie la session d'un utilisateur pendant qu'il publie sur un forum?

J'utilise déjà JQuery sur ces pages, donc éventuellement ping sur un serveur, mais sur quels événements? Le backend est un Struts sur Tomcat.

+0

15 minutes semble terriblement court. Ne pourriez-vous pas augmenter le délai d'attente? – Eli

Répondre

24

Étant donné que vous ne voulez pas changer le délai d'attente de la session du site ..

Définir un événement délai d'attente/intervalle (< 15min) en javascript et décider ce qu'il faut faire lorsque l'événement se déclenche. Si vous voulez que la session soit active aussi longtemps que la page est ouverte, alors bien, continuez à cingler tous les < 15 min. Mais ce n'est probablement pas ce que vous voulez car un utilisateur quittant un ordinateur public devrait être déconnecté à un moment donné.

Vous pouvez gérer une variable lastActivity, qui est mise à jour sur chaque document mousemove ou document keydown. S'il y a eu une activité depuis le dernier ping, ping de nouveau. Pour plus de sophistication, vous pouvez compter les événements et envoyer une requête ping au serveur uniquement si le nombre d'événements> seuil à la fin du délai d'attente est dépassé.

L'exemple de base:

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

Avec vérification de base pour l'activité en tapant:

$(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

Si l'utilisateur était assez stupide pour partir en laissant le navigateur ouvert et connecté, je ne voudrais pas déranger. – casablanca

+0

Merci, cela semble une excellente façon de le faire. – Nick

0

Vous pouvez définir un intervalle de plus de 5 minutes:

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);

Ou vérifier s'il/elle est encore en train de taper quelque chose:

<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

Je pense que vous ne voulez vraiment pas cela pour toutes les pages. Si vous deviez le faire sur toutes les pages, même celles qui ne dépendent pas vraiment des variables de session, vous consommez beaucoup de mémoire.

Je vous suggère de jeter un conditionnel à le faire que sur certaines pages où il est nécessaire, à savoir

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