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

135

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.

Oriol Terradas
la source
1
C'est une chose que l'utilisateur doit faire: Ouvrez IE, cliquez sur "Fichier-> Nouvelle session"
Stefan Steiger
3
@Quandary, votre solution n'est pas une solution générique (dans d'autres navigateurs ne fonctionne pas) et, surtout, elle n'est pas conviviale (les utilisateurs ne connaissent pas les sessions).
Oriol Terradas
2
Certaines personnes semblent incapables d'imaginer quel est le but de tout cela. Le domaine problématique est la plupart des situations dans lesquelles vous souhaitez autoriser différentes «vues» de votre site Web. Une fois que l'utilisateur peut avoir plus d'une vue de votre site Web, il tarde inévitablement (ou essaie accidentellement) d'accéder à deux vues différentes en même temps. Les exemples incluent: la gestion des versions temporelles (passage à l'affichage du site Web tel qu'il existait à un certain moment dans le passé); sandboxing (apporter des modifications au site Web que d'autres ne peuvent pas encore voir); vues basées sur les rôles (voir à quoi ressemble le site Web pour un utilisateur moins privilégié); etc.
Ron Burk

Réponses:

92

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.

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

Gonzalo Gallotti
la source
7
Extrait de la documentation: "Les données stockées à l'aide de sessionStorage ne persistent pas dans les onglets du navigateur, même si deux onglets contiennent tous deux des pages Web de la même origine de domaine. En d'autres termes, les données à l'intérieur de sessionStorage ne se limitent pas uniquement au domaine et au répertoire de la page qui appelle, mais l'onglet du navigateur dans lequel la page est contenue. Comparez cela aux cookies de session, qui conservent les données d'un onglet à l'autre. " Des tests simples confirment ce comportement dans Chrome et FF.
jswanson le
21
Notez que l'ID sera dupliqué lors de l'utilisation de la fonctionnalité "Dupliquer l'onglet" de Chrome. Ce n'est généralement pas un problème, mais devrait être réfléchi.
JosiahDaniels
Sauf lorsque vous "Dupliquez" un onglet dans Chrome ou Firefox. Dans ce cas, SessionStorage est copié.
Tiago Freitas Leal
@Gonzalo Gallotti: Et comment cela m'aidera-t-il si la session est côté serveur? )))
Stefan Steiger
@StefanSteiger. Ensuite, vous pouvez envoyer l'identifiant BrowserTab (enregistré dans le stockage de session) avec votre appel Ajax. Côté serveur, vous aurez besoin d'une logique personnalisée, car la WebSession est la même. Mais vous pouvez créer un HashMap avec des objets Session par onglet.
Gonzalo Gallotti
23

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:

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

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.

Michael Borgwardt
la source
6
C'est pour une grosse application qui conserve les informations utilisateur et l'environnement. Quand quelqu'un se connecte avec différents utilisateurs dans différents onglets, pour des tests ou pour des rôles différents, alors il croise les informations des onglets.
Oriol Terradas
Juste un add-on très tardif, expliquant pourquoi: parce que j'ai besoin de savoir ceci afin de savoir sur QUELLE page de mon site, par exemple, un utilisateur se concentre, et pas seulement qu'il est passé de page en page ( au lieu de cela, ils sont passés d'un onglet à l'autre).
Oliver Williams
16

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

Dave Bish
la source
3
window.sessionStorage fait aussi
felickz
3
attention car le stockage de session est copié dans un nouvel onglet lorsque l'utilisateur choisit "ouvrir dans un nouvel onglet" ... j'aurais
felickz
2
Sachez que ce que vous enregistrez dans le paramètre window.name sera toujours disponible dans d'autres domaines, lorsque l'utilisateur passe à d'autres pages dans le même onglet.
nakib
15

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.

dr. mal
la source
9
C'est pour une grosse application qui conserve les informations utilisateur et l'environnement. Quand quelqu'un se connecte avec différents utilisateurs dans différents onglets, pour des tests ou pour des rôles différents, alors il croise les informations des onglets.
Oriol Terradas
38
ancienne réponse je sais, mais google mail vous permet d'avoir différents comptes par onglet et ce n'est pas une "application totalement inutilisable"
George
2
@George, La réponse est toujours juste, et pour votre exemple, vous verrez dans le numéro d'url représenter l'index des comptes stockés dans les cookies, google mail ne fait que stocker tous les cookies et en sélectionner un en fonction de l'url.
Mhmd
5
Pas sûr que la réponse soit toujours juste, vous pouvez clairement le faire. Gmail le fait. Quant à savoir comment il le fait, ce n'est peut-être pas élégant, mais cela fonctionne et c'est ce qui est important
George
2
Ancienne réponse, mais je peux ajouter que Whatsapp et Telegram ne vous permettent pas d'ouvrir deux onglets en même temps. Cela ne les rend pas inutilisables
Charlie
13

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 ...

Kev
la source
6
+1 parce que vous avez pris le temps de bien réfléchir! :-) En regardant toutes les mises en garde, vous savez juste que c'est une mauvaise idée. Mes leçons apprises de ces choses sont de vraiment comprendre quelles données devraient entrer dans les sessions et quelles données ne devraient pas.
Peter
10

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.

23423.abc.com
242234.abc.com
235643.abc.com

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.

user3534653
la source
3
Cela semble être une alternative intelligente à la réécriture d'URL. Vous vous retrouvez avec la variable souhaitée (ID de session) dans un endroit conforme à HTTP qui est visible mais pas gênant. Nits qui viennent à l'esprit: 1) ont besoin d'un caractère générique sur DNS, évidemment, 2) l'ensemble de votre site Web doit éviter toute URL absolue qui redirigerait l'utilisateur vers (par exemple) le sous-domaine «www», 3) veulent probablement empêcher les robots d'exploration , mais il s'agit probablement d'une situation sur le Web privé, ce qui peut déjà être fait. Merci d'avoir partagé ça!
Ron Burk
@ user3534653: J'aime l'approche. Mais vous avez dit "aucune programmation impliquée". Ensuite, vous dites "avec peu de changement de code". Alors vraiment, un petit changement de code n'est pas de la programmation? ;) De plus, cette approche peut ne pas fonctionner si vous avez plusieurs applications avec des liens canoniques où le domaine est codé en dur / configuré (canoniquement).
Stefan Steiger le
5

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:

//Events 
$(window).ready(function() {generateWindowID()});
$(window).focus(function() {setAppId()});
$(window).mouseover(function() {setAppId()});


function generateWindowID()
{
    //first see if the name is already set, if not, set it.
    if (se_appframe().name.indexOf("SEAppId") == -1){
            "window.name = 'SEAppId' + (new Date()).getTime()
    }
    setAppId()
}

function setAppId()
{
    //generate the cookie
    strCookie = 'seAppId=' + se_appframe().name + ';';
    strCookie += ' path=/';

    if (window.location.protocol.toLowerCase() == 'https:'){
        strCookie += ' secure;';
    }

    document.cookie = strCookie;
}

côté serveur (C # - à des fins d'exemple)

//variable name 
string varname = "";
HttpCookie aCookie = Request.Cookies["seAppId"];
if(aCookie != null) {
     varname  = Request.Cookies["seAppId"].Value + "_";
}
varname += "_mySessionVariable";

//write session data 
Session[varname] = "ABC123";

//readsession data 
String myVariable = Session[varname];

Terminé.

Mike A.
la source
1
J'aime beaucoup votre réponse simplifiée et la référence du rasoir d'Occam. Je voulais juste vérifier que cette solution fonctionne toujours pour vous.
Jeff Marino le
1
Il convient de noter que si l'actualisation de la page devait conserver sa session, cette approche ne fonctionnerait pas. L'autre approche suggérée dans une autre réponse concernant l'utilisation de window.sessionStorage me semble plus raisonnable.
rosenfeld
@quijibo fonctionne toujours parfaitement dans mon application, oui. En ce qui concerne l'actualisation de la page, cela peut être vrai pour certains navigateurs, l'utilisation de window.sessionStorage peut résoudre le problème, je ne l'ai pas essayé
Mike A.
3
Quelle est la fonction "se_appframe ()"?
AndreMiranda
Qu'est-ce que se_appframe ?
Kiquenet
2

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.

Bombe
la source
2
Je pense que la réécriture de liens pour encoder des sessions est une tâche fastidieuse et sujette aux erreurs. J'ai une grosse application, avec beaucoup de liens, j'ai besoin d'une solution transparente ou facile à mettre en œuvre.
Oriol Terradas
2

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

lsoliveira
la source
1

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.

Stephen
la source
1

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

Sarit Kommineni
la source
1

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:

<form method="post" action="/handler">

  <input type="hidden" name="sessionId" value="123456890123456890ABCDEF01" />
  <input type="hidden" name="action" value="" />

</form>

Chaque action de votre côté, y compris la navigation, POST le formulaire (en définissant le actionle 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:

<input type="hidden" name="action" value="completeCheckout" />
<input type="hidden" name="data" value='{ "cardNumber" : "4111111111111111", ... ' />

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é:

  • Pas de dépendance sur JavaScript ou HTML5.
  • Protège intrinsèquement contre CSRF .
  • Pas de dépendance aux cookies, protège donc contre POODLE .
  • Non vulnérable à la fixation de session .
  • Peut empêcher l'utilisation du bouton de retour, ce qui est souhaitable lorsque vous souhaitez que les utilisateurs suivent un chemin défini à travers votre site (ce qui signifie que les bogues logiques qui peuvent parfois être attaqués par des demandes dans le désordre, peuvent être évités).

Quelques inconvénients:

  • La fonctionnalité du bouton Retour peut être souhaitée.
  • Pas très efficace avec la mise en cache car chaque action est un POST.

Plus d'informations ici .

SilverlightFox
la source
1

J'ai résolu ceci de la manière suivante:

  • J'ai attribué un nom à la fenêtre, ce nom est le même que celui de la ressource de connexion.
  • plus 1 pour débarrasser stocké dans le cookie pour attacher la connexion.
  • J'ai créé une fonction pour capturer toutes les réponses xmloutput et attribuer sid et débarrasser au cookie au format json. Je fais cela pour chaque window.name.

voici le code:

var deferred = $q.defer(),
        self = this,
        onConnect = function(status){
          if (status === Strophe.Status.CONNECTING) {
            deferred.notify({status: 'connecting'});
          } else if (status === Strophe.Status.CONNFAIL) {
            self.connected = false;
            deferred.notify({status: 'fail'});
          } else if (status === Strophe.Status.DISCONNECTING) {
            deferred.notify({status: 'disconnecting'});
          } else if (status === Strophe.Status.DISCONNECTED) {
            self.connected = false;
            deferred.notify({status: 'disconnected'});
          } else if (status === Strophe.Status.CONNECTED) {
            self.connection.send($pres().tree());
            self.connected = true;
            deferred.resolve({status: 'connected'});
          } else if (status === Strophe.Status.ATTACHED) {
            deferred.resolve({status: 'attached'});
            self.connected = true;
          }
        },
        output = function(data){
          if (self.connected){
            var rid = $(data).attr('rid'),
                sid = $(data).attr('sid'),
                storage = {};

            if (localStorageService.cookie.get('day_bind')){
              storage = localStorageService.cookie.get('day_bind');
            }else{
              storage = {};
            }
            storage[$window.name] = sid + '-' + rid;
            localStorageService.cookie.set('day_bind', angular.toJson(storage));
          }
        };
    if ($window.name){
      var storage = localStorageService.cookie.get('day_bind'),
          value = storage[$window.name].split('-')
          sid = value[0],
          rid = value[1];
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.attach('bosh@' + BoshDomain + '/' + $window.name, sid, parseInt(rid, 10) + 1, onConnect);
    }else{
      $window.name = 'web_' + (new Date()).getTime();
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.connect('bosh@' + BoshDomain + '/' + $window.name, '123456', onConnect);
    }

J'espère vous aider

Allemand Sanchez
la source
0

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:

  1. Si l'utilisateur accède à l'écran de connexion, recherchez une session existante. S'il en existe un, contournez l'écran de connexion et envoyez-le à l'écran d'accueil.
  2. Si l'utilisateur (dans mon cas) accède à l'écran d'inscription, recherchez une session existante. S'il en existe un, informez l'utilisateur que vous allez déconnecter cette session. S'ils sont d'accord, déconnectez-vous et commencez l'inscription.

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.

Mike Perrenoud
la source
0

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.

client
la source
1
C'est probablement correct, mais théoriquement dangereux. Certains systèmes d'exploitation (par exemple Windows) ont une granularité d'horodatage très grossière, ce qui signifie que vous pouvez rechercher l'horodatage plusieurs fois et récupérer la même valeur. De plus, si vous rouvrez un navigateur après un crash et qu'il rouvre tous les onglets à la fois, ils peuvent avoir le même horodatage.
Gili le
0
How to differ sessions in browser-tabs?

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.

Kingz
la source
0

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

Mhmd
la source
0

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

vasa.v03
la source
0

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.

hussein.g
la source