2010-11-24 2 views
8

Ich arbeite an diesem Problem für 2 Tage jetzt und ich hoffe, dass jeder hier ein ähnliches Problem und eine Lösung dafür hatte.Tomcat eine neue Sitzung für jede Anfrage erstellen

Das Problem: Es ist ein Spring MVC (2.5.6.) Web-Anwendung, die in Tomcat läuft 6. Wenn der Start-Seite angefordert wird, den Kunden zu einer JSP-Seite umleitet (von HTML Meta-Refresh-Tags) welches seinen Inhalt mit vielen Ajax-Anfragen lädt (Framework: Prototype). Das Problem ist, dass Tomcat für jede AJAX-Anfrage eine neue Sitzung erstellt (ca. 67 Sitzungen). Mein erster Gedanke war, dass der Sitzungs-Cookie gespeichert wird, nachdem die Startseite geladen wurde und die Ajax-Anforderungen den Tomcat zwingen, eine neue Sitzung zu erstellen. Mein Ansatz war es, den Session-Cookie per Hand zu erstellen, aber das machte keinen Unterschied. Die lustige Sache ist, dass es in einigen anderen Tomcat-Instanzen funktioniert, aber nicht in der gewünschten Umgebung für die Integrationstests. Meiner Meinung nach ist es ein Tomcat-Konfigurationsproblem.

Nach einer weiteren Untersuchung mit Firebug, fand ich heraus, dass Tomcat eine neue Session erstellt für jede Anforderung, auch wenn das Recht JSESSIONID es übertragen wird (50B5EA0BCFE811C744CE9C1F9EDE0097):

Request Header 1: 
Cookie JSESSIONID=F3206CBF2C961E125821FF22FA31A02D 

Response Header 1: 
Set-Cookie JSESSIONID=49E000B4D6880F4F94531AB9C78DB667; Path=/JOCA-Music-Portal JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097; Path=/JOCA-Music-Portal 

Request Header 2: 
Cookie JSESSIONID=50B5EA0BCFE811C744CE9C1F9EDE0097 

Response Header 2: 
Set-Cookie JSESSIONID=DCCA2D1B98D11223A6B8855800276E27; Path=/JOCA-Music-Portal 

UPDATE: Weitere Untersuchungen isoliert, um das Problem zu die Tomcat Realm-Konfiguration. Wir verwenden einen JDBC-Realm für die Anmeldung. Wenn die Anmeldung deaktiviert wird, wird nur eine Sitzung erstellt. Wenn es aktiviert ist, erstellt Tomcat ungültige/abgelaufene Sitzungen, deshalb wird bei jeder Anfrage eine neue Sitzung erstellt. Aber warum verhält sich Tomcat so?

Ich bin wirklich verzweifelt, also wird jeder Gedanke/Hinweis/Lösung gut geschätzt.

Vielen Dank

+0

Haben Sie die Lösung erhalten? –

Antwort

3

Sie auf analyze the HTTP traffic zwischen dem Client und dem Server versuchen. Stellen Sie sicher, dass der Cookie-Header in der Anfrage und in der Antwort richtig eingestellt ist.

Wenn Sie Firefox verwenden, können Sie versuchen, mit Firebug zu debuggen.

+0

Zunächst einmal vielen Dank für Ihre Antwort. Der Cookie-Header ist richtig eingestellt, ich habe es mit Firebug überprüft. Ich habe vergessen zu erwähnen, dass es in einigen anderen Umgebungen problemlos funktioniert hat, aber nicht in den Integrationstestumgebungen. – Fabe

+0

Gibt es in Ihrer Tomcat-Konfiguration 'cookies = false' in Ihrem' '? Was ist der Wert von 'useHttpOnly'? – gawi

+0

Nein, ich habe keinen Kontextabschnitt in /META-INF/context.xml definiert, so dass Cookies und useHttpOnly nicht gesetzt sind. Sollte ich eine context.xml definieren? – Fabe

2

Wir haben kürzlich das gleiche Problem mit einer App, die wir entwickelt haben, bekommen. Kommen Sie, um herauszufinden, das Problem ist, dass Tomcat geändert wurde, um Angriffe zur Sitzfixierung zu verhindern. Standardmäßig wird bei der Authentifizierung eine neue Sitzungs-ID erstellt. Dies begann mit 6.0.21. Überprüfen Sie die Kontextkonfigurationsoption 'changeSessionIdOnAuthentication' (tomcat bug/issue ist https://issues.apache.org/bugzilla/show_bug.cgi?id=45255).

+0

Vielen Dank! - Ich werde es überprüfen;) – Fabe

0

Wir haben das gleiche Problem, aber bei Verwendung von benutzerdefinierten EXTERNALSSO Authentifizierung. Die Lösung war, sie explizit im Konstruktor unserer Klasse zu deaktivieren, die von org.apache.catalina.authenticator.AuthenticatorBase erbt:

Verwandte Themen