2016-12-05 3 views
0

ist es möglich, gleichzeitige Änderungen einer Sitzung zu verhindern, wenn mehrere Load-Balanced-Instanzen einer Anwendung ausgeführt werden?Spring-Sitzung - gleichzeitige Änderung der Sitzung verhindern

Kontext: Mehrere Tomcats, die alle die gleiche Anwendung ausführen. Die Anwendung verwendet Spring-Sitzung, um die Sitzungen in einem Redis-Cluster zu speichern. Ein Load Balancer verteilt eingehende Anfragen an einen der Tomcats (nicht-sticky). User hits Button, Tomcat 1 verarbeitet die Anfrage sehr langsam (Performance-Problem oder was auch immer). Der Benutzer drückt den Button erneut, tomcat 2 ist viel schneller und antwortet erfolgreich. Der Benutzer fährt mit den folgenden Seiten fort. Tomcat 1 beendet die allererste Anfrage und überschreibt die Sitzung - die Daten aller vorhergehenden Seiten gehen verloren.

Eine Lösung wäre, die Sitzung zu sperren. Dadurch kann Tomcat 2 die gleichzeitige Änderung erkennen und mit einem Fehler antworten (viel besser als einen inkonsistenten Zustand zu erhalten).

Thx viel AB

Antwort

0

Spring Session verwendet keine Sitzung Verriegelungsmechanismen, da dies eine sehr negative Auswirkungen der Leistung haben würde. Beachten Sie, dass sich Ihr Beispiel auf eine einzelne Konversation konzentriert, während die Sperre alle Anfragen betrifft, die zu einer bestimmten Sitzung gehören, von denen viele vollkommen sicher sind, gleichzeitig ausgeführt zu werden.

Für Szenario aus Ihrem Beispiel sollte ein anderer Mechanismus zum Schutz verwendet werden. Dies könnte etwas Einfaches sein, wie das Deaktivieren der Schaltfläche auf der Benutzeroberfläche, bis die Aktion abgeschlossen ist, wodurch die nachfolgende Anforderung verhindert wird, oder der CSRF-Schutz verwendet wird, der sicherstellen würde, dass jede Anfrage die Server-Seite ändert. Beachten Sie auch, dass die meisten von Spring Session bereitgestellten Session-Repository-Implementierungen Optimierungen von Schreiboperationen bieten, deren Ziel es ist, die Race Conditions zu reduzieren. Dies beinhaltet das Überprüfen der Session auf Änderungen vor dem Speichern und in einigen Fällen optimierte Speicheroperationen schreibe nur die Attribute, die sich geändert haben. Dies wird in jedem Sitzungsrepository aufgrund der unterschiedlichen Natur der zugrunde liegenden Datenspeicher anders gehandhabt. Überprüfen Sie daher die SessionRepository#save Implementierung im Repository Ihrer Wahl.

Möglicherweise etwas verwandt, Spring Session bietet Integration mit Spring Security die gleichzeitige Sitzungssteuerung ab Release 1.3.0 (das heißt, zum Zeitpunkt des Schreibens dieses Posts in Release-Phase). Sie können die reference manual für Details überprüfen.

+0

Thx viel Vedran. Einige Anmerkungen: Das Deaktivieren der Schaltfläche löst das Problem nicht, da ein Benutzer immer noch "F5" drücken oder mehrere Browserfenster verwenden kann. Ich habe keinen geeigneten Mechanismus gefunden, um mein Problem in irgendeinem SessionRepository zu behandeln - jedenfalls löst das RedisOperationsSessionRepository das Problem definitiv nicht. Die Verwendung eines CSRF-Schutz-Tokens ist eine sehr interessante Idee, um gleichzeitige Änderungen zu erkennen. Ich werde es versuchen. – user7252656

Verwandte Themen