Dans une application Web implémentée en java à l'aide de JSP et de servlets; si je stocke des informations dans la session utilisateur, ces informations sont partagées à partir de tous les onglets du même navigateur. Comment différer 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éployez ce fichier dans un contexte existant d'une application web sur le serveur (j'utilise Apache Tomcat), puis ouvrez un navigateur (FF, IE7 ou Opera) en utilisant l'URL correcte ( localhost/context1/testpage.jsp
), tapez votre nom dans l'entrée et soumettez le formulaire. Ensuite, ouvrez un nouvel onglet dans le même navigateur, puis vous pouvez voir votre nom (obtenir de la session) sur le nouvel onglet. Soyez prudent avec le cache du navigateur, il semble parfois que cela n'arrive pas, mais il est dans le cache, actualisez le deuxième onglet.
Merci.
Réponses:
Vous pouvez utiliser HTML5 SessionStorage (window.sessionStorage). Vous allez générer un identifiant aléatoire et enregistrer dans le stockage de session par onglet du navigateur. Ensuite, chaque onglet du navigateur a son propre identifiant.
la source
Vous devez comprendre que les sessions côté serveur sont un complément artificiel à HTTP. Puisque HTTP est sans état, le serveur doit reconnaître d'une manière ou d'une autre qu'une requête appartient à un utilisateur particulier qu'il connaît et pour lequel il a une session. Il existe 2 façons de procéder:
Qu'essayez-vous 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?
Modifier: Pour les tests, d'autres solutions peuvent être trouvées (telles que l'exécution de plusieurs instances de navigateur sur des machines virtuelles distinctes). Si un utilisateur a besoin d'agir dans différents rôles en même temps, le concept de «rôle» doit être géré dans l'application afin qu'une connexion puisse avoir plusieurs rôles. Vous devrez décider si cela, en utilisant la réécriture d'URL ou simplement vivre avec la situation actuelle, est plus acceptable, car il n'est tout simplement pas possible de gérer les onglets du navigateur séparément avec des sessions basées sur les cookies.
la source
La propriété Javascript window.name est la seule chose qui persistera dans l'activité des onglets, mais peut rester indépendante (au lieu de l'URL guff).
la source
Tu ne devrais pas. Si vous voulez faire une telle chose, vous devez forcer l'utilisateur à utiliser une seule instance de votre application en écrivant des URL à la volée, utilisez un identifiant sessionID (et non sessionid cela ne fonctionnera pas) et passez-le dans chaque URL.
Je ne sais pas pourquoi vous en avez besoin, mais à moins que vous ne deviez créer une application totalement inutilisable, ne le faites pas.
la source
J'ai trouvé une nouvelle solution, qui a un petit peu de frais généraux, mais semble fonctionner jusqu'à présent comme un prototype. Une hypothèse est que vous êtes dans un environnement système d'honneur pour vous connecter, bien que cela puisse être adapté en demandant à nouveau un mot de passe chaque fois que vous changez d'onglet.
Utilisez localStorage (ou équivalent) et l'événement de stockage HTML5 pour détecter lorsqu'un nouvel onglet de navigateur a changé l'utilisateur actif. Lorsque cela se produit, créez une superposition fantôme avec un message indiquant que vous ne pouvez pas utiliser la fenêtre actuelle (ou désactivez temporairement la fenêtre, vous ne voudrez peut-être pas qu'elle soit aussi visible.) Lorsque la fenêtre reprend le focus, envoyez une demande de journalisation AJAX l'utilisateur revient dans.
Une mise en garde à cette approche: vous ne pouvez pas avoir d'appels AJAX normaux (c'est-à-dire ceux qui dépendent de votre session) dans une fenêtre qui n'a pas le focus (par exemple si vous avez eu un appel après un délai), sauf si vous effectuez manuellement un appel de reconnexion AJAX avant cela. Donc, tout ce que vous avez à faire est de vérifier d'abord votre fonction AJAX pour vous assurer que localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id, et si ce n'est pas le cas, connectez-vous d'abord via AJAX.
Une autre est les conditions de concurrence: si vous pouvez changer de fenêtre assez rapidement pour la confondre, vous pouvez vous retrouver avec une séquence relogin1-> relogin2-> ajax1-> ajax2, avec ajax1 étant fait sous la mauvaise session. Contournez ce problème en poussant les demandes de connexion AJAX sur un tableau, puis sur le stockage et avant d'émettre une nouvelle demande de connexion, abandonnez toutes les demandes en cours.
Le dernier problème à rechercher est l'actualisation de la fenêtre. Si quelqu'un actualise la fenêtre alors que vous avez une demande de connexion AJAX active mais pas terminée, elle sera actualisée au nom de la mauvaise personne. Dans ce cas, vous pouvez utiliser l'événement non standard beforeunload pour avertir l'utilisateur de la confusion potentielle et lui demander de cliquer sur Annuler, tout en réémettant une demande de connexion AJAX. Ensuite, la seule façon de le bâcler est de cliquer sur OK avant la fin de la demande (ou en appuyant accidentellement sur entrée / barre d'espace, car OK est - malheureusement pour ce cas - la valeur par défaut.) Il existe d'autres façons de gérer ce cas, comme détecter les pressions F5 et Ctrl + R / Alt + R, ce qui fonctionnera dans la plupart des cas mais pourrait être contrecarré par la reconfiguration des raccourcis clavier de l'utilisateur ou l'utilisation alternative du système d'exploitation. Cependant, c'est un peu un cas de pointe en réalité, et les pires scénarios ne sont jamais aussi mauvais: dans une configuration de système d'honneur, vous seriez connecté comme la mauvaise personne (mais vous pouvez rendre évident que c'est le cas en personnalisant les pages avec des couleurs, des styles, des noms bien en évidence, etc.); dans une configuration de mot de passe, il incombe à la dernière personne qui a entré son mot de passe de se déconnecter ou de partager sa session, ou si cette personne est en fait l'utilisateur actuel, il n'y a pas de violation.
Mais à la fin, vous avez une application à un utilisateur par onglet qui (espérons-le) agit comme il se doit, sans avoir à configurer nécessairement des profils, à utiliser IE ou à réécrire les URL. Assurez-vous de le rendre évident dans chaque onglet qui est connecté à cet onglet particulier, cependant ...
la source
Nous avons eu ce problème et nous l'avons résolu très facilement. Je veux dire facile car aucune programmation n'est impliquée. Ce que nous voulions faire était de permettre à un utilisateur de se connecter à plusieurs comptes dans la même fenêtre de navigateur sans entrer en conflit les sessions.
La solution était donc des sous-domaines aléatoires.
Nous avons donc demandé à notre administrateur système de configurer les certificats SSL pour * .abc.com plutôt que abc.com. Ensuite, avec peu de changement de code, chaque fois qu'un utilisateur tente de se connecter, il se connecte dans un onglet avec un numéro de sous-domaine aléatoire. afin que chaque onglet puisse avoir sa propre session indépendamment. Aussi pour éviter tout conflit, nous avons développé le nombre aléatoire en utilisant un hachage ou md5 d'identifiant d'utilisateur.
la source
Je serai honnête ici. . . tout ce qui précède peut ou peut ne pas être vrai, mais tout semble BEAUCOUP trop compliqué, ou ne permet pas de savoir quel onglet est utilisé côté serveur.
Parfois, nous devons appliquer le rasoir d'Occam.
Voici l'approche d'Occam: (non, je ne suis pas Occam, il est mort en 1347)
1) Attribuez un identifiant unique de navigateur à votre page lors du chargement. . . si et seulement si la fenêtre n'a pas encore d'identifiant (utilisez donc un préfixe et une détection)
2) sur chaque page que vous avez (utilisez un fichier global ou quelque chose), mettez simplement du code en place pour détecter l'événement focus et / ou l'événement mouseover. (J'utiliserai jquery pour cette partie, pour faciliter l'écriture de code)
3) dans votre fonction focus (et / ou mouseover), définissez un cookie avec le window.name dedans
4) lisez cette valeur de cookie depuis votre serveur lorsque vous avez besoin de lire / écrire des données spécifiques à un onglet.
Côté client:
côté serveur (C # - à des fins d'exemple)
Terminé.
la source
Vous pouvez utiliser la réécriture de liens pour ajouter un identifiant unique à toutes vos URL lorsque vous démarrez sur une seule page (par exemple, index.html / jsp / peu importe). Le navigateur utilisera les mêmes cookies pour tous vos onglets afin que tout ce que vous mettez dans les cookies ne soit pas unique.
la source
Je pense que ce que vous voulez probablement, c'est maintenir l'état de navigation entre les onglets et ne pas créer spécifiquement une seule session par onglet. C'est exactement ce que le framework Seam réalise avec sa portée / contexte de conversation. Leur implémentation repose sur le fait qu'un identifiant de conversation est propagé avec chaque requête et crée la notion de conversation côté serveur, qui se situe entre une session et une requête. Il permet le contrôle du flux de navigation et la gestion de l'état.
Bien que cela soit principalement destiné à JSF, jetez un œil et vérifiez si c'est quelque chose où vous pouvez prendre quelques idées: http://docs.jboss.org/seam/latest/reference/en-US/html_single/#d0e3620
la source
En javascript, comment puis-je identifier de manière unique une fenêtre de navigateur à partir d'une autre qui se trouve sous la même sessionId basée sur la cuisine
Utilisez essentiellement window.name. S'il n'est pas défini, définissez-le sur une valeur unique et utilisez-la. Ce sera différent selon les onglets appartenant à la même session.
la source
Une autre approche qui fonctionne consiste à créer un identifiant de fenêtre unique et à stocker cette valeur avec l'identifiant de session dans une table de base de données. L'identifiant de fenêtre que j'utilise souvent est un entier (maintenant). Cette valeur est créée lorsqu'une fenêtre est ouverte et réaffectée à la même fenêtre si la fenêtre est actualisée, rechargée ou soumise à elle-même. Les valeurs de fenêtre (entrées) sont enregistrées dans la table locale à l'aide du lien. Lorsqu'une valeur est requise, elle est obtenue à partir de la table de base de données en fonction du lien id de fenêtre / id de session. Bien que cette approche nécessite une base de données locale, elle est pratiquement infaillible. L'utilisation d'une table de base de données était facile pour moi, mais je ne vois aucune raison pour laquelle les tableaux locaux ne fonctionneraient pas aussi bien.
la source
J'ai récemment développé une solution à ce problème en utilisant des cookies. Voici un lien vers ma solution. J'ai également inclus un exemple de code de la solution utilisant ASP.NET, vous devriez pouvoir l'adapter à JSP ou Servelets si vous en avez besoin.
https://sites.google.com/site/sarittechworld/track-client-windows
la source
Spring Session prend en charge plusieurs sessions dans le même navigateur Regardez les exemples et les détails de mise en œuvre http://docs.spring.io/spring-session/docs/current/reference/html5/guides/users.html
la source
Remarque: La solution ici doit être effectuée au stade de la conception de l'application. Il serait difficile de concevoir cela plus tard.
Utilisez un champ masqué pour transmettre l'identifiant de session .
Pour que cela fonctionne, chaque page doit inclure un formulaire:
Chaque action de votre côté, y compris la navigation, POST le formulaire (en définissant le
action
le cas échéant). Pour les demandes "non sécurisées" , vous pouvez inclure un autre paramètre, par exemple contenant une valeur JSON des données à soumettre:Comme il n'y a pas de cookies, chaque onglet sera indépendant et n'aura aucune connaissance des autres sessions dans le même navigateur.
De nombreux avantages, notamment en matière de sécurité:
Quelques inconvénients:
Plus d'informations ici .
la source
J'ai résolu ceci de la manière suivante:
voici le code:
J'espère vous aider
la source
J'ai lu cet article parce que je pensais que je voulais faire la même chose. J'ai une situation similaire pour une application sur laquelle je travaille. Et c'est vraiment une question de test plus que de praticité.
Après avoir lu ces réponses, en particulier celle donnée par Michael Borgwardt, j'ai réalisé le flux de travail qui doit exister:
Cela résoudra le problème de l'utilisateur voyant les données d'un «autre utilisateur» dans sa session. Ils ne voient pas vraiment les données d'un "autre utilisateur" dans leur session, ils voient vraiment les données de la seule session qu'ils ont ouverte. De toute évidence, cela entraîne des données intéressantes car certaines opérations écrasent certaines données de session et pas d'autres, de sorte que vous avez une combinaison de données dans cette session unique.
Maintenant, pour résoudre le problème des tests. La seule approche viable serait de tirer parti des directives de préprocesseur pour déterminer si des sessions sans cookie doivent être utilisées. Voyez, en créant une configuration spécifique pour un environnement spécifique, je suis capable de faire des hypothèses sur l'environnement et à quoi il sert. Cela me permettrait techniquement d'avoir deux utilisateurs connectés en même temps et le testeur pourrait tester plusieurs scénarios à partir de la même session de navigateur sans jamais se déconnecter de l'une de ces sessions de serveur.
Cependant, cette approche comporte de sérieuses mises en garde. Le fait que le testeur teste n'est pas ce qui va fonctionner en production n'est pas le moindre .
Je pense donc que je dois dire que c'est finalement une mauvaise idée.
la source
Stockage de timeStamp dans window.sessionStorage s'il n'est pas déjà défini. Cela donnera une valeur unique pour chaque onglet (même si les URL sont identiques)
http://www.javascriptkit.com/javatutors/domstorage.shtml
https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage
J'espère que cela t'aides.
la source
Le moyen le plus simple de différer les sessions dans les onglets du navigateur consiste à interdire à votre domaine particulier de définir des cookies. De cette façon, vous pouvez avoir des sessions séparées à partir d'onglets séparés. Disons que vous interdisez les cookies de ce domaine: www.xyz.com. Vous ouvrez l'onglet 1, vous connectez et commencez à naviguer. Ensuite, vous ouvrez l'onglet 2 et vous pouvez vous connecter en tant que même utilisateur ou en tant qu'utilisateur différent; de toute façon, vous aurez une session distincte de l'onglet 1. Et ainsi de suite.
Mais bien sûr, cela est possible lorsque vous contrôlez le côté client. Sinon, les solutions prescrites par les gens ici devraient s'appliquer.
la source
vous devrez faire
1- stocker un cookie pour la liste des comptes
2- stockage facultatif d'un cookie pour celui par défaut
3- stocker pour chaque compte avec son index comme acc1, acc2
4- mettre dans l'url quelque chose qui représente l'index des comptes et sinon, vous sélectionnerez celui par défaut comme google mail domain.com/0/some-url >> 0 représente ici l'index du compte aussi vous devrez peut-être savoir comment utiliser urlwrite
5- lorsque vous sélectionnez un cookie, sélectionnez-le en fonction de votre urlpath représente l'index du compte
Cordialement
la source
Je vois de nombreuses implémentations qui ont des modifications côté client pour manipuler les cookies d'identifiant de session. Mais en général, les cookies d'identifiant de session doivent être HttpOnly afin que java-script ne puisse pas accéder, sinon cela peut conduire à un piratage de session via XSS
la source
Si c'est parce que chaque onglet exécute un flux différent dans votre application et que le mélange des deux flux pose des problèmes, il est préférable de «régionaliser» vos objets de session, afin que chaque flux utilise une région différente de la session
Cette région peut être implémentée aussi simplement que d'avoir différents préfixes pour chaque flux, ou l'objet de session contiendra plusieurs cartes (une pour chaque flux), et vous utilisez ces cartes au lieu d'attributs de session, le mieux serait d'étendre votre classe de session et utilisez-le à la place.
la source