Verhindern mehrerer Browsersitzungen auf derselben Serversitzung

Ich bin sicher, wir haben alle an Webanwendungen gearbeitet oder sind uns dessen bewusst (insbesondere im Unternehmen), die sich eng an die Serversitzung gebunden haben. In diesen Fällen ist es möglich, dass die Sitzung beschädigt wird, wenn mehr als eine Browsersitzung geöffnet ist und dasselbe Server-Sitzungscookie verwendet. Wir haben alle Optionen geprüft und festgestellt, dass es am besten ist, von der Verwendung mehrerer Browsersitzungen abzuraten, in denen ein Server-Sitzungscookie verwendet wird.

Dies ist nur dann wirklich ein Problem, wenn ein Benutzer ausführtNew Window - Ctrl+N im IE oder das Äquivalent von "Registerkarte duplizieren" in anderen Browsern. Im Wesentlichen haben wir zwei aktive Browsersitzungen, in denen dieselben Cookies verwendet werden.

Um dies zu verhindern (da es wahrscheinlich unbeabsichtigt sein wird), habe ich mich vorgenommen, eine Art Warnsystem einzurichten, um dieses Verhalten zu verhindern. Jetzt führt unser Code zahlreiche Prüfungen der Parallelität durch, um die Datenintegrität sicherzustellen. Es kann jedoch weiterhin Probleme mit der Datenbeschädigung geben.

Nachdem ich festgestellt habe, dass die allgemeine Antwort "Es ist unmöglich" ist, habe ich mich darauf verlassen, dass AJAX "Pings" aussendet und die Zeit zwischen diesen misst. Wir haben also eine allgemeine Regel: Wir "pingen" in einem bestimmten Intervall und ob das Delta zwischen dem letzten Ping im aktuellen Ping istgeringer, weniger Wir wissen, dass wir mehrere aktive Browsersitzungen auf einer einzelnen Serversitzung haben.

Also woPf ist die Ping-Frequenz;Pc ist der aktuelle Ping; undPl Ist der letzte Ping, dann haben wir einen Fehler wennPf > (Pc - Pl).

           p1    p2    p3    p4
TAB1 0-----|-----|-----|-----|---...
                 :     :     :
                 :  p1 :  p2 :  p3    p4
TAB2          0-----|-----|-----|-----|---...
     ^     ^     ^  ^  ^  ^  ^  ^
                  Deltas
----+---+------------
TAB | P |   Delta (Pc - Pl)
----+---+------------                 
 1  | 1 |   5
 1  | 2 |   5
 2  | 1 |   2.5 -Error
 1  | 3 |   2.5 -Error
 2  | 2 |   2.5 -Error

Wenn nun eine Überlastung des Netzwerks oder andere Faktoren vorliegen, ist dies das Deltagrößer als die Frequenz, Fehlalarme auszuschließen.

Wir haben ein Problem, wenn zwei Registerkarten zum exakt gleichen Zeitpunkt geöffnet sind. Da die Ping-Frequenz jedoch nur die Häufigkeit ist, mit der die Anforderungen gestellt werden, und keine garantierte abgelaufene Zeit, können wir davon ausgehen, dass die beiden Browsersitzungen bald nicht mehr synchron sind.

Im Beispiel habe ich die Ping-Frequenz auf alle 5 Sekunden eingestellt. Wenn 100 Benutzer gleichzeitig angemeldet sind, suchen wir nach ~ 20 Anfragen / Sekunde für das Ping-Servlet / HttpModule. Um unnötigen Netzwerkverkehr zu minimieren, dachte ich, dass die Ping-Frequenz mit der Zeit abnehmen würde, bis ein Maximum von 20 Pings / Sekunde erreicht wurde. Dies würde bei 100 gleichzeitigen Benutzern ~ 5 Anforderungen / Sekunde betragen. Dies ist jedoch ein Kompromiss, da die Erkennung verzögert wird. Sobald die Erkennung erfolgt ist, wird die Frequenz bis zur Auflösung auf 5 Pings / Sekunde zurückgesetzt. (Diese Zahlen sind nur ein Beispiel; sie würden je nach Umgebung variieren.)

Um Parallelitäts- und Skalierbarkeitsprobleme zu minimieren, sollte der letzte Ping-Zeitstempel für die Sitzung in der Sitzung selbst beibehalten werden. Auf diese Weise kann jede Technologie für verteilte Sitzungen die Verfügbarkeit der Sitzung über JVMs oder App-Domänen hinweg aufrechterhalten, ohne dass unser Ping-Service sich dessen bewusst sein muss.

Ich versuche herauszufinden, ob dies ein vernünftiger Ansatz ist oder nicht, wenn ich in eine Welt voller Verletzungen gerate. Jede Erfahrung mit dem Problem wäre hilfreich.

BEARBEITEN: Ich weiß, das klingt wie ein Pflaster, aber das soll eine Notlösung sein, bis wir die beleidigende Bibliothek herausreißen können.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage