2013-12-10 5 views
16

Ok, ich möchte, dass meine Webanwendung HTTP-Sitzungen auf mehreren Webservern verwenden kann. Ich kann auch keine sticky-Sitzungen oder Sitzungsreplikation verwenden!Wie kann ich sicherstellen, dass Spring Security die HTTP-Sitzung in einer Datenbank speichert, um die Webanwendung auf mehreren Servern zu verwenden?

Was ist die beste Vorgehensweise für Spring Security, da Spring Security bereits HTTP-Sitzungen verarbeitet? Bietet Spring etwas OOTB? Oder hat es eine Option, um die Sitzungsinformationen in der Datenbank zu speichern? SecurityContextPersistenceFilter?

+0

Aus Neugier easly tun kann, warum ist klebrig Sitzung eine Nicht-Option für Sie? – gerrytan

+0

Nicht OP, aber für uns ist es nicht praktikabel, da wir in der Lage sein werden, die Server zu verkleinern, ohne auf das Ablaufen der Sitzungen warten zu müssen. – Dave4988

Antwort

10

Sie können Ihren Container so konfigurieren, dass Sitzung mit der Datenbank über JDBC persistiert wird. Wenn Sie Tomcat verwenden, können Sie den JDBC-Sitzungspersistenzanbieter konfigurieren. Ich nehme an, Sie können das auch auf anderen Containern tun.

Ich habe zum Einrichten tomcat JDBC Sitzungspersistenz auf meinem Blog die Schritte dokumentiert: http://gerrydevstory.com/2013/08/21/tomcat-7-jdbc-session-persistence/

Zusammengefasst Sie eine Konfiguration wie diese auf Ihrem context.xml benötigen:

<Manager className="org.apache.catalina.session.PersistentManager" 
     maxIdleBackup="10"> 
    <Store className="org.apache.catalina.session.JDBCStore" 
     connectionURL="jdbc:mysql://localhost/mytomcat?user=root" 
     driverName="com.mysql.jdbc.Driver" 
     sessionAppCol="app_name" 
     sessionDataCol="session_data" 
     sessionIdCol="session_id" 
     sessionLastAccessedCol="last_access" 
     sessionMaxInactiveCol="max_inactive" 
     sessionTable="tomcat_sessions" 
     sessionValidCol="valid_session" /> 
</Manager> 

jedoch maxIdleBackup="10" oben zeigt an, dass die Sitzung erst nach 10 Sekunden Inaktivität in jdbc geleert wird. Ich weiß nicht, ob es funktioniert, wenn ich es auf 0 setze.

Ich kann mir vorstellen, dass die ganze Sache ohne Sticky Load Balancer Sitzung funktioniert, zB: Wie können Sie sicherstellen, dass Sitzungsupdates vor der nächsten Anfrage gelöscht werden? Sie können nicht garantieren, dass die nächste Anfrage vom selben Knoten bedient wird.

Vielleicht ist eine andere Alternative, wenn Sie Ihr Selbst hacken können/gibt es eine andere Session-Provider-Bibliothek, die direkt in die Datenbank schreibt.

bearbeiten 21. Mai 2014:

ich nur hazelcast WM is a great library to do peer-to-peer session replication herausgefunden. Alles, was Sie tun müssen, ist, haselnussbraune Gläser in den Klassenpfad einzubauen, hazelcast-wm als Filter für Ihre web.xml einzurichten und hazelcast zu konfigurieren. Es wird automatisch Sitzungsobjekte über Cluster replizieren.

+0

danke, klingt wie eine gute Option für mich auch. Ich frage mich, wie gut das mit der Frühjahrssession funktionieren wird? Muss ich andere Einstellungen vornehmen, um mit der bestehenden Sitzung zu arbeiten? Ich werde es ausprobieren! – Jaxox

+0

Ich glaube nicht, dass Sie andere Einstellungen benötigen. Alles funktioniert über die HttpSession-Schnittstelle. – gerrytan

+0

Aber was, wenn ich Tomcat-spezifische Dateien nicht ändern kann. Ich habe nur die Kontrolle über meine Frühjahrskonfiguration – zengr

Verwandte Themen