2009-04-30 4 views
22

J'utilise des cookies de session avec mon site Web. À ma grande surprise, j'ai remarqué que si je mets un cookie de session (pas un cookie persistant), ferme un onglet, puis me reconnecte au site, les cookies de session sont toujours là. Ce n'est pas ce à quoi je m'attendais, en fait. Je m'attendais à ce que les cookies de session soient supprimés.Pourquoi ne pas fermer un onglet Supprimer un cookie de session?

Si vous fermez le navigateur, un cookie de session est supprimé, alors pourquoi ne pas fermer un onglet pour obtenir le même résultat?

Par conséquent, j'utilise PHP5 et jQuery. Y a-t-il quelque chose que je puisse faire de telle sorte que lorsqu'un onglet est fermé, je peux résoudre ce problème de session? Malheureusement, l'événement onbeforeunload sur le tag BODY n'est pas utile ici car lorsque vous cliquez loin d'une page, il déclenche cet événement, et pas seulement la fermeture d'un onglet.

Répondre

14

Le cookie de session est par processus et non par fenêtre. Donc, même si vous avez sélectionné Nouvelle fenêtre, vous obtiendrez toujours le même identifiant de session. Ce comportement a du sens. Vous ne voulez pas qu'un utilisateur se reconnecte à chaque fois qu'il ouvre une nouvelle fenêtre en naviguant sur votre site.

Je ne suis pas au courant de la moindre façon de contourner ce problème.

+0

Paul, voir mon commentaire à Sander ci-dessous qui commence, "Le problème ici ..." –

+1

Dans de telles circonstances, la fermeture de l'onglet n'est pas le problème principal. C'est contrôler l'expiration de la session plus activement. Vous souhaiterez implémenter une sorte de timeout d'activité sur le client dans JS qui se déconnecte automatiquement après aucune activité de l'utilisateur. Vous trouverez ce type de comportement sur la plupart des sites bancaires. –

+0

Paul, vous avez raison. J'ai dormi sur la question et c'est le plan d'action que je prévois de prendre. Maintenant, pour mettre dans une autre question de stackoverflow sur la façon la plus optimale de mettre en œuvre cela. –

8

Ceci est de par sa conception et essayer de le changer est une très mauvaise idée. Que faire si un utilisateur ouvre un lien dans un nouvel onglet et ferme cela? La session de l'onglet d'origine doit-elle être détruite? Bien sûr que non! Cela démontre pourquoi vous ne devriez même pas y penser.

Une session se termine lorsque la dernière fenêtre du navigateur se ferme. Si vous voulez quelque chose d'autre, vous:

  1. ne veulent pas de sessions;
  2. besoin de faire votre propre "mini-session" infrastructure;
  3. sont probablement dans un monde de mal et de bugs.
+3

Le problème ici est un environnement public, comme une bibliothèque, et le profil en ligne de quelqu'un avec des informations d'identité à l'intérieur. Je dois trouver une solution. –

+0

Néanmoins, il semble que vous ayez quelques bonnes réponses à cette question, et devriez choisir l'une d'entre elles comme réponse correcte. Peut-être que vous voulez également commencer une nouvelle question? – bignose

3

Vous pouvez également écrire un javascript qui détecte lorsqu'un onglet est fermé et supprimer le cookie dans le javascript

+3

Comment pourriez-vous faire cela? – thesecretmaster

+0

essayer d'ajouter un écouteur à beforeunload événement – Hammer

+0

je l'ai fait quelque chose comme ça $ (fenêtre) .scroll (function() { \t \t si (sessionStorage.getItem ('advertOnce')! == 'true') { \t \t \t \t sessionStorage.setItem ('advertOnce', 'vrai'); \t \t \t \t initPopup(); \t \t \t \t \t} \t}); –

2

session stockage Web peut être utilisé à la place de cookies si vous avez besoin de dépendre de la fermeture de l'onglet.

1

J'ai trouvé une solution. Je travaille dans ASP.NETC#. J'ai un Master Page pour toutes les pages du site à l'exception de la page Login. Dans le Master Page Sever Page Load event Je reçois le Url de la page de renvoi et de vérifier s'il contient la racine du site, sinon je redirige vers la page Login et puisqu'il n'a pas que Master Page il affiche.

Cela fonctionne si j'essaie d'accéder à une page d'un autre site ou si j'entre le Url dans la zone d'adresse du navigateur. Donc, si vous fermez l'onglet et que vous essayez de revenir d'un autre onglet ou de rouvrir l'onglet, même si le cookie n'a pas été détruit, vous ne pouvez pas entrer à nouveau dans le site sans passer par Login. Cela fonctionne même si vous n'avez pas fermé l'onglet et votre navigation entre différents sites dans le même onglet.

Ce code

if (Request.UrlReferrer == null || !Request.UrlReferrer.AbsoluteUri.ToString().Contains("root")) 
     { 
      Response.Redirect("~/Account/Login.aspx"); 
     } 

Lors de la navigation à l'intérieur du site, il n'y a pas de problème, même si vous ouvrez un lien vers une autre page du site à un autre onglet ouvre.

Si vous voulez être sûr que vous pouvez tuer le cookie de session et d'authentification dans cette clause if avant de redistribuer à la page Login. Cela ne fonctionnera pas si un utilisateur accède à un autre site dans le même onglet et appuie sur le bouton back to du navigateur, car cela fonctionne sur le cache et n'envoie pas automatiquement une requête au serveur. Cela n'élimine pas le cookie de session ou d'authentification à la fermeture de l'onglet, mais il peut empêcher la réintégration du site sans se connecter après la fermeture de l'onglet.

Questions connexes