2010-07-31 6 views
0

Le stockage de l'identifiant de session sur l'ordinateur client n'est pas un problème et est très simple. Le problème est de stocker la session sur le serveur jusqu'à ce que je sente que j'en ai fini avec.Je ne veux pas qu'une session soit invalide tant que le navigateur n'est pas fermé

Le garbage collector est assez clair sur la façon dont cela fonctionne. Je ne vois aucun moyen de l'empêcher de nettoyer les ordures dans un certain temps. Je peux fixer ce temps, mais risquer le piratage de session (qui est encore très petit et détourner la session ne serait pas plus utile pour un pirate) ou avoir le répertoire de session surchargé (devinez que vous avez vraiment besoin d'un trafic énorme pour cela mais quand même ...)

Est-ce la seule solution pour faire des requêtes HTTP régulières avec javascript pour empêcher le GC de récupérer la session si le client est inactif?

Merci d'avance

Répondre

3

À peu près oui. Vous ne pouvez pas détecter de manière fiable que la fenêtre du navigateur a été fermée. Même si JS propose un événement de fermeture de veuvage, vous ne devez pas l'utiliser, car la fermeture du navigateur en cliquant sur le bouton «Fermer» n'est que l'une des nombreuses façons dont la session cliente peut se terminer.

Autres possibilités:

  1. tombe en panne navigateur
  2. bloque l'ordinateur client
  3. Connexion réseau meurt
  4. Plusieurs navigateurs ne considèrent pas fermer la fenêtre d'un événement unload (Opera ne considère même pas la fermeture un onglet ou en s'éloignant d'une page Web en tapant une adresse dans la barre d'adresse un événement de déchargement)
+0

Le cœur du problème est que HTTP est un protocole sans état. (Vous pouvez envisager d'ajouter cela, ou une référence à cette déclaration, par ... j'ai oublié.) – MvanGeest

+0

Je ne suis pas sûr si vous avez abordé le problème du bon angle. Je n'ai pas nécessairement besoin de détruire la session "de près". Il devrait finalement être nettoyé dans un proche avenir de toute façon, car il n'a pas été lu ou mis à jour pendant un certain temps. Je veux juste empêcher la session d'être saccagée pendant que le navigateur est encore en cours d'exécution (Cette session particulière du navigateur bien sûr) Le fait qu'il pourrait tomber en panne ou d'autres choses stupides ne devrait pas être considéré. Il n'y a aucun moyen d'empêcher Murphy de faire son travail. – Anders

+1

Mon point était, seul moyen fiable de vérifier s'il y a encore quelqu'un de l'autre côté de la connexion est de leur parler. – Mchl

1

Si vous souhaitez conserver les sessions pour toujours, définissez un garbage collector personnalisé.

Cependant, vous n'avez aucun moyen réel de savoir quand les utilisateurs ferment leur navigateur. Le plus simple est de configurer un pion JavaScript ou META REFRESH qui vous tiendra informé tant que votre page est ouverte, mais vous ne pouvez pas savoir que le navigateur n'est pas ouvert sur une autre page.

+0

Je suppose que cela n'a pas d'importance s'ils ont ma page ou une autre ouverte. Faites-vous référence à plusieurs onglets ouverts ou quelque chose? Quand ils quittent mon site, le javascript arrêtera de cingler le serveur à droite? Cela ne devrait donc pas être une préoccupation pour autant que je puisse comprendre? – Anders

0

Je crois que vous pouvez utiliser XMLHTTPRequest (Ajax Technology) pour envoyer une commande ping à votre serveur pour, par exemple, une page vierge avec simple session_start(); Dites, toutes les quinze minutes (le délai d'expiration de la session PHP par défaut est de 20 secondes) afin qu'ils ne surchargent pas votre serveur. Mais, si vous voulez vraiment avoir des données persistantes, un cookie sans temps d'expiration explicite est nettoyé à la sortie du navigateur, de sorte que vous pouvez stocker une clé de stockage dans un cookie. Cela a un avantage sur la session - si la connexion réseau du client meurt, la session fonctionne toujours. Mais cela risque davantage de détourner la session. Si vous parlez de garder la connexion persiste dans une session de navigateur, un cookie est préféré, et est utilisé par de nombreux sites à travers le monde, y compris Drupal, Wordpress et Joomla! CMS.

+0

Merci pour la réponse Nat. A propos de cette dernière partie. Parlez-vous de stocker les détails de connexion dans le cookie ou simplement session-id dans le cookie. Je suis un peu confus. Vous avez un lien vers un article ou un tutoriel couvrant l'utilisation de cookies au lieu d'une session à des fins de connexion? – Anders

0

Il existe plusieurs façons, dont aucune n'est souhaitable. Je vais énumérer ce que j'apprends. Note: J'espère que les gens comprennent cela. La plupart des gens supposent que je veux me déconnecter seulement lorsque le client ferme le navigateur. Ce n'est pas le cas, je veux juste libérer des ressources au lieu de 20 minutes de retard. La plupart des développeurs mettent juste à jour l'ordinateur, je suppose.

1) Gardez ping votre serveur du script du client, ainsi, il gardera la "courte session" vivante. Cela va évidemment augmenter le trafic vers votre serveur et il ne sera évidemment pas déconnecté instantanément car vous ne voulez pas pinger comme chaque seconde.

2) Utilisez Javascript du broswer client. Jusqu'à présent, je ne pense pas qu'aucun d'entre eux fonctionne, même l'exemple existant de code IE, le clienX sera> 0. De toute façon, voici le code qui fonctionne pour moi jusqu'à présent. Seulement sur IE depuis Firefox ne fonctionne pas pour moi en ce moment. J'ai à peu près calculé la position du bouton de fermeture relativement sur l'écran et déterminer si le client a cliqué sur cette zone. Si le bouton d'actualisation est trop proche du bouton de fermeture (x sage), il semblera que vous avez cliqué sur le bouton de fermeture, mais c'est un cas rare.

<head runat="server"> 
    <title>Untitled Page</title> 
<script type="text/javascript"> 
    function test(event) { 
     var X = window.event ? window.event.screenX : event.clientX; 

     // IE only because event.clientX for FF = undefined (event.clientX IS the FF way). 
     if (X == null) { 
      alert("No X"); 
      return; 
     } 

     var left = window.screenLeft ? window.screenLeft : window.screenX; 
     var winwidth = document.body.clientWidth ? document.body.clientWidth : window.outerWidth; 
     var leftMargin = document.body.leftMargin ? parseInt(document.body.leftMargin, 10) : 0; 
     var rightMargin = document.body.rightMargin ? parseInt(document.body.rightMargin, 10) : 0; 
     var resultX = X - (window.screenLeft + winwidth + leftMargin + rightMargin); // scroll bar width is not calculated. 
     var Y = window.event ? window.event.clientY : event.clientY; 

     if (resultX > -25 && Y < 0) 
      alert("logging out"); 
    }; 
</script> 

</head> 
<body onbeforeunload="test(event);"> 
Questions connexes