HttpSession über mehrere Webapplikationen?
Webapplikationen können über die HttpSession keine Daten austauschen, da eine HttpSession immer an einen ServletContext gebunden ist. Wenn eine Webapplikation eine andere Webapplikation über den RequestDispatcher inkludiert, wird zwar eine Session mit der gleichen(!) SessionID erzeugt, es sind aber effektiv zwei HttpSession Objekte vorhanden.
Vergleiche Servlet Specification 2.4. (Kapitel 15.1.7)
Session information is scoped only to the current web application
(ServletContext), so information stored in one context will not be directly visible
in another.
Auch für JSR 168-konforme Portlets gelten diese Restriktionen. So konnen Portlets nur innerhalb der gleichen PortletApplication gemeinsame Daten austauschen. (Eine PortletApplication wird mit Hilfe einer Webapplikation realisiert). Diese Restriktion soll mit JSR 286 aufgehoben werden. Im Early Draft Review werden sogenannte “Shared Session Attribute” vorgestellt. Hier definiert der Portlet-Entwickler die gemeinsamen Session Attribute in der portlet.xml. Das JAXB Framework (Java Architecture for XML Binding) wird verwendet, um den Typ des Session Attributes zu beschreiben. Konkret bedeutet dass, das die Klasse für das Shared Attribut mit JAXB Annotations versehen wird. So kann das Attribut auch in anderen VMs ausgelesen werden, da die Klasse mit Hilfe von JAXB wieder zusammengebaut wird (Stichwort “marshalling”).
December 13th, 2006 at 11:40 am
Das kann aber zu Security-Problemen führen, oder nicht?
Szenario:
Benutzer A benutzt die Applikation WebApp_A
Benutzer B benutzt die Applikation WebApp_B
Die beiden WebApplikationen benutzen eine WebApp_C
Zufälligerweise erhalten die Benutzer A und B in den jeweiligen WebApplikationen, dieselbe SessionID.
Frage:
Was passiert jetzt mit der Session in WebApp_C? Bekommen beide Benutzer dieselbe Session in der WebApp_C?
stejan
December 13th, 2006 at 8:02 pm
Hoi stejan,
Gute Frage. Konkret wird im Tomcat 5.5 beim Generieren der SessionID überprüft, ob sie nicht schon existiert.
Zwei gleiche SessionIDs werden also nie erzeugt, nur beim RequestDispatcher.include wird die vorhandene SessionID im anderen Context wiederverwendet. Von kann es nie passieren dass zwei Benutzer die gleiche SessionID besitzen.
Wer sich die Generierung einer SessionID genauer angucken möchte, sollte sich die Methode generateSessionID in der Klasse org.apache.catalina.session.ManagerBase anschauen (Tomcat 5.5.20)
Grüsse
Heiko
December 14th, 2006 at 1:35 am
eine session für mehrere web-applikationen geht nicht? – bea behauptet: geht schon!
nebenbedingung 1: die web-applikationen müssen in einem ear-file deployed sein und im deployment-descriptor der applikation muss das entsprechende flag (hier: sharing-enabled) auf true gesetzt werden.
nebenbedingung 2: man will sich unbedingt einen bea weblogic installieren
viele grüsse
odilo
December 14th, 2006 at 8:08 am
jo, bea löst diese Restriktion proprietär. Webapplikationen, die dieses Feature verwenden, laufen dann nur noch auf dem Bea
Viele Grüsse
Heiko