143 votes

Comment différencier les sessions dans les onglets du navigateur ?

Dans une application web implémentée en Java avec des JSP et des Servlets, si je stocke des informations dans la session de l'utilisateur, ces informations sont partagées par tous les onglets du même navigateur. Comment différencier les sessions dans les onglets du navigateur ? Dans cet exemple :

<%@page language="java"%>
<%
String user = request.getParameter("user");
user = (user == null ? (String)session.getAttribute("SESSIONS_USER") : user);
session.setAttribute("SESSIONS_USER",user);
%>
<html><head></head><body>
<%=user %>
<form method="post">
User:<input name="user" value="">
<input type="submit" value="send">
</form>
</body></html>

Copiez ce code dans une page jsp ( testpage.jsp ), déployer ce fichier dans un contexte existant d'une application web sur le serveur (j'utilise Apache Tomcat), puis ouvrir un navigateur (FF, IE7 ou Opera) en utilisant l'URL correcte ( localhost/context1/testpage.jsp ), tapez votre nom dans la zone de saisie et soumettez le formulaire. Ouvrez ensuite un nouvel onglet dans le même navigateur, et vous pourrez voir votre nom (obtenu lors de la session) sur le nouvel onglet. Faites attention au cache du navigateur, parfois il semble que cela n'arrive pas, mais c'est dans le cache, rafraîchissez le deuxième onglet.

Merci.

0 votes

1 votes

C'est une chose que l'utilisateur doit faire : Ouvrir IE, cliquer sur "Fichier->Nouvelle Session".

3 votes

@Quandary, votre solution n'est pas une solution générique (elle ne fonctionne pas dans d'autres navigateurs) et, surtout, elle n'est pas conviviale (les utilisateurs ne connaissent pas les sessions).

100voto

Gonzalo Gallotti Points 410

Vous pouvez utiliser le HTML5 SessionStorage (window.sessionStorage). Vous générerez un identifiant aléatoire et l'enregistrerez dans le stockage de session par onglet de navigateur. Ainsi, chaque onglet de navigateur a son propre identifiant.

Les données stockées à l'aide de sessionStorage ne persistent pas entre les onglets du navigateur, même si deux onglets contiennent tous deux des pages Web provenant du même domaine. En d'autres termes, En d'autres termes, les données contenues dans sessionStorage sont confinées non seulement au domaine et au répertoire de la page qui l'invoque, mais aussi à l'onglet de navigateur dans lequel la page est contenue. Comparez cela aux cookies de session, qui persistent les données d'un onglet à l'autre.

7 votes

Dans la documentation : "Les données stockées à l'aide de sessionStorage ne persistent pas d'un onglet de navigateur à l'autre, même si deux onglets contiennent tous deux des pages Web provenant du même domaine. En d'autres termes, les données contenues dans sessionStorage sont limitées non seulement au domaine et au répertoire de la page qui les invoque, mais aussi à l'onglet du navigateur dans lequel la page est contenue. Comparez cela aux cookies de session, qui persistent les données d'un onglet à l'autre." Des tests simples confirment ce comportement dans Chrome et FF.

24 votes

Notez que l'ID sera dupliqué si vous utilisez la fonction "Dupliquer l'onglet" de Chrome. Ce n'est généralement pas un problème, mais il faut y réfléchir.

0 votes

Sauf lorsque vous "dupliquez" un onglet dans Chrome ou Firefox. Dans ce cas, le SessionStorage est copié.

26voto

Craig Points 181

Voici un bon exemple de la raison pour laquelle il est nécessaire de séparer les sessions, puisque tant de personnes le demandent :

  1. L'utilisateur ouvre une session initiale sur l'onglet 1 du navigateur
  2. L'utilisateur ajoute un article au panier dans l'onglet 1, ce qui déclenche la commande.
  3. L'utilisateur ouvre l'onglet 2, qui se trouve dans la même session, dans le même ordre.
  4. L'utilisateur effectue certaines opérations sur l'onglet 2, mais revient finalement à l'onglet 1.
  5. L'utilisateur termine la commande sur l'onglet 1, et revient à l'onglet 2.
  6. L'utilisateur s'attend maintenant à ce que l'onglet 2 fonctionne, même si la commande associée a déjà été soumise.

Certes, il existe des moyens de faire face à ce problème, mais aucun n'est simple. Il serait BEAUCOUP plus facile de pouvoir isoler les onglets dans différentes sessions.

25voto

Michael Borgwardt Points 181658

Il faut savoir que les sessions côté serveur sont un ajout artificiel à HTTP. Puisque HTTP est sans état, le serveur doit d'une manière ou d'une autre reconnaître qu'une requête appartient à un utilisateur particulier qu'il connaît et pour lequel il a une session. Il y a deux façons de le faire :

  • Cookies. La méthode la plus propre et la plus populaire, mais elle signifie que tous les onglets du navigateur et les fenêtres d'un utilisateur partagent la session - IMO cela est en fait souhaitable, et je serais très ennuyé par un site qui m'oblige à me connecter pour chaque nouvel onglet, puisque j'utilise les onglets de manière très intensive.
  • Réécriture d'URL. Toute URL sur le site a un identifiant de session qui lui est ajouté. Cela représente plus de travail (vous devez faire quelque chose partout où vous avez un lien interne au site), mais permet d'avoir des sessions séparées dans différents onglets, bien que les onglets ouverts par un lien partagent toujours la session. Cela signifie également que l'utilisateur doit toujours se connecter lorsqu'il vient sur votre site.

Qu'est-ce que vous essayez de faire de toute façon ? Pourquoi voudriez-vous que les onglets aient des sessions séparées ? Peut-être existe-t-il un moyen d'atteindre votre objectif sans utiliser de sessions du tout ?

Edit : Pour les tests, d'autres solutions peuvent être trouvées (comme l'exécution de plusieurs instances de navigateur sur des VM distinctes). Si un utilisateur doit agir dans différents rôles en même temps, le concept de "rôle" doit être géré dans l'application de sorte qu'un login puisse avoir plusieurs rôles. Vous devrez décider si cette solution, l'utilisation de la réécriture d'URL ou le fait de vivre avec la situation actuelle est plus acceptable, car il n'est tout simplement pas possible de gérer les onglets de navigateur séparément avec des sessions basées sur les cookies.

6 votes

C'est pour une grande application qui garde les informations de l'utilisateur et l'environnement. Lorsque quelqu'un se connecte avec différents utilisateurs dans différents onglets, pour des tests ou pour différents rôles, alors il croise les informations des onglets.

0 votes

Juste un ajout très tardif, pour savoir pourquoi : parce que j'ai besoin de le savoir pour savoir SUR QUELLE page de mon site, par exemple, un utilisateur se concentre, et pas seulement qu'il est allé de page en page (plutôt qu'il est allé d'onglet en onglet).

16voto

Dave Bish Points 7943

La propriété Javascript window.name est la seule chose qui persistera à travers l'activité de l'onglet, mais qui peut rester indépendante (au lieu de l'URL).

3 votes

window.sessionStorage le fait aussi

3 votes

attention, le stockage de la session est copié dans un nouvel onglet lorsque l'utilisateur choisit "ouvrir dans un nouvel onglet" ... j'aurais aimé avoir le lien pour les détails mais je vois : bugzilla.mozilla.org/show_bug.cgi?id=818389

2 votes

Sachez que ce que vous enregistrez dans le paramètre window.name sera toujours disponible dans d'autres domaines, lorsque l'utilisateur passera à d'autres pages dans le même onglet.

15voto

dr. evil Points 12196

Tu ne devrais pas. Si vous voulez faire une telle chose, soit vous devez forcer l'utilisateur à utiliser une seule instance de votre application en écrivant des URL à la volée, soit vous utilisez un identifiant semblable à l'identifiant de session (pas l'identifiant de session, cela ne fonctionnera pas) et vous le passez dans chaque URL.

Je ne sais pas pourquoi vous en avez besoin, mais à moins que vous n'ayez besoin de créer une application totalement inutilisable, ne le faites pas.

9 votes

C'est pour une grande application qui garde les informations de l'utilisateur et l'environnement. Lorsque quelqu'un se connecte avec différents utilisateurs dans différents onglets, pour des tests ou pour différents rôles, alors il croise les informations des onglets.

1 votes

Je vois comme je dis que c'est une mauvaise idée. Je suppose que cette application sera pour une équipe ou quelque chose comme ça, et non pas publique pour tout le monde. Dans ce cas, je dirais que l'exécution d'un nouvel Internet Explorer ou d'un nouveau profil sur Firefox peut sauver la journée. Les autres solutions vous mordront les doigts pour le reste du projet, à mon avis.

0 votes

Exécuter un nouvel IE, c'est-à-dire exécuter à nouveau IE dans une nouvelle fenêtre. Cela permet de séparer les sessions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X