Frage

In der Standardeinstellung Katers wird ein Session-Cookie für die aktuelle Domäne erstellen.

Wenn Sie auf www.example.com sind, wird Ihr Cookie für www.example.com erstellt werden (nur auf www.example.com arbeiten). Während für example.com wird es für .example.com erstellt wird (gewünschtes Verhalten, wird auf jeder Sub-Domain von example.com arbeiten sowie example.com selbst).

Ich habe ein paar Tomcat Ventile gesehen, die scheinen die Erstellung von Session-Cookies abzufangen und einen Ersatz-Cookie mit der richtigen .example.com Domäne erstellen, aber keiner von ihnen scheint einwandfrei zu arbeiten und sie alle scheinen den bestehenden zu verlassen Cookie und nur einen neuen erstellen. Das bedeutet, dass zwei JSESSIONID Cookies mit jeder Anfrage gesendet werden.

Ich habe mich gefragt, ob jemand eine endgültige Lösung für dieses Problem hat.

War es hilfreich?

Lösung

Dies wird offenbar über eine Konfigurationseinstellung in 6.0.27 unterstützt und weiter:

  

Die Konfiguration wird durch Bearbeitung getan   META-INF / context.xml

     

https://issues.apache.org/bugzilla/show_bug.cgi? id = 48379

Andere Tipps

Ich habe gerade durch all dies für eine einfache Lösung suchen gegangen. Ich begann es aus der Perspektive Kater suchen.

Tomcat geben keinen direkten Zugriff auf den Domain-Cookie für die Session zu konfigurieren, und ich wollte auf keinen Fall, um benutzerdefinierte Patch tomcat, dieses Problem zu beheben, wie in einigen anderen Stellen gezeigt.

Ventile in tomcat scheint auch auf die Einschränkungen durch eine Lösung des Problems zu sein, auf in die Servlet-Spezifikation gebaut Header & Cookies zugreifen. Sie scheitern auch vollständig, wenn die HTTP-Antwort verpflichtet ist, bevor es zu einem Ventil übergeben wird.

Da wir Proxy unsere Anfragen durch Apache, zog ich dann auf, wie Apache verwenden, um das Problem zu beheben, statt.

Ich habe versucht, zuerst die Mod_proxy Richtlinie ProxyPassReverseCookieDomain, aber es funktioniert nicht für JSESSIONID Cookies, weil tomcat das Domain-Attribut nicht gesetzt und ProxyPassReverseCookieDomain kann ohne irgendeine Art von Domain als Teil des Cookies nicht funktionieren.

Ich kam auch über einen Hack ProxyPassReverseCookiePath, wo sie den Pfad Umschreiben wurden eine Domain-Attribut auf den Cookie hinzuzufügen, aber das fühlte Weg für eine Produktionsstätte unordentlich.

Ich habe es endlich durch Umschreiben der Antwort-Header mit dem mod_headers Modul in Apache zu arbeiten, wie oben von Dave erwähnt.

Ich habe die folgende Zeile in der virtuellen Host-Definition hinzugefügt:

Header edit Set-Cookie "(JSESSIONID\s?=[^;,]+?)((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(;\s?(?:(?i)Domain\s?=)[^;,]+?)?((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(,|$)" "$1$2; Domain=.example.com$4$5"

Die vor allem eine einzige Zeile in der Config sein sollte. Es wird jedes JSESSIONID Cookies Domain-Attribut mit „.example.com“ ersetzen. Wenn ein JSESSIONID Cookie keine Domäne-Attribut enthält, dann wird das Muster eines mit einem Wert von „.example.com“ hinzufügen. Als Bonus ist diese Lösung nicht aus der Doppel jsession Cookies Problem der Ventile leiden.

Das Muster sollte in den Set-Cookie-Header mit mehreren Cookies arbeiten, ohne die anderen Cookies im Header zu beeinflussen. Es sollte auch modifizierbar sein, mit anderen Cookies zu arbeiten, indem JSESSIONID im ersten Teil des Musters auf dem, was Cookie-Namen ändern, die Sie wünschen.

I reg-ex Power-User bin nicht, so bin ich sicher ein paar Optimierungen gibt, die dem Muster gemacht werden könnte, aber es scheint für uns so weit zu arbeiten.

Ich werde diesen Beitrag aktualisieren, wenn ich irgendwelche Fehler mit dem Muster finden. Hoffentlich wird dies ein paar von euch zu stoppen durch die letzten paar Tage gehen im Wert von Frustrationen wie ich.

Ich habe in diesen bei $ Dayjob laufen. In meinem Fall wollte ich SSL signon dann umleiten auf eine nicht SSL-Seite implementieren. Das Kernproblem in tomcat ist das Verfahren (aus dem Gedächtnis) SessionManager.configureSessionCookie, die alle hart Codes Variablen, die Sie mögen Zugang zu bekommen.

kam ich mit ein paar Ideen, darunter ein besonders ungeheuerlich Hack mod_headers in Apache mit dem Cookie neu zu schreiben, basierend auf regex Substitution.

Der definative Weg, dies zu lösen wäre ein Patch auf die tomcat Entwickler zu senden, die den konfigurierbaren Parametern der Sessionmanager-Klasse erstellt.

Als eine Sitzung (und seine Id) grundsätzlich von Wert für die Verlegerung Anwendung nur in Betracht gezogen wird, kann man eher sucht eine zusätzliche Cookie zu setzen. Werfen Sie einen Blick auf Tomcats SingleSignOnValve, die extra-Cookie-JSESSIONIDSSO Providing (beachten Sie die ... SSO) für den Server-Pfad "/" anstelle von "/ application" (wie JSESSIONID Cookies werden in der Regel festgelegt).

Mit einem solchen Ventil können Sie eine beliebige Interprozess-Kommunikation implementieren Sie benötigen, um jeden Zustand zwischen verschiedenen Servern, virtuellen Hosts oder Webapps auf einer beliebigen Anzahl von Katern / webservers zu synchronisieren / was auch immer.

Ein weiterer Grund, warum Sie nicht tomcats Session-Cookie für Ihre eigenen Zwecke ist, dass mehrere Webapps auf dem gleichen Host haben verschiedene Session-IDs verwenden. Z.B. gibt es verschiedene Cookies für "/ WebApp1" und "/ webapp2". Wenn Sie bieten „/ WebApp1“ 's Cookie ‚/ webapp2‘, würde dies nicht finden die Sitzung, die Sie Bezug genommen wird, ungültig machen Ihre Sitzung + Cookie und legen Sie seine eigene neue. Sie müßten alles tomcats Session Handling neu zu schreiben externen Session-ID-Werte (schlechte Idee SecurityWise) zu akzeptieren oder einen bestimmten Zustand zwischen Anwendungen zu teilen.

Session Handling sollte die Behälter (Kater) Unternehmen betrachtet werden. Was auch immer Sie sonst noch brauchen Sie ohne zu stören sollte hinzufügen, was der Behälter glaubt, ist notwendig zu tun.

Die Ventiltechniken scheinen nicht zu 100% perfekt zu sein. Wenn Sie es wagen Tomcat zu ändern sich:

catalina.jar enthält die folgende Klasse: org.apache.catalina.connector.Request

Der Antrag hat eine Methode:

configureSessionCookie(Cookie cookie)

Für unsere Umwelt ist es am besten war es einfach zu codieren, aber man konnte mehr Phantasie Logik tun:

cookie.setDomain(".xyz.com");

Es scheint perfekt zu arbeiten. Wäre schön, wenn diese in tomcat konfigurierbar ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top