# HttpSession bekommen wenn nicht in Servlet



## bense (2. Apr 2009)

Hallo zusammen

Ich habe ein Servlet. In der Session speichere ich die Login-Informationen. Nun benötige ich diese Daten in einem Objekt, das keinen Zugriff auf das Servlet und die Session hat. Die Session überall hin mitgeben möchte und kann ich nicht.

Meine Überlegung war, dass ich bei jedem POST-/GET-Request die Session in ein Singleton speichere und dann ja überall Zugriff darauf habe. Jetzt ist mir jedoch eingefallen, dass ja dieses Singleton für alle Benutzer da ist und somit unter Umständen wenn 2 Requests gleichzeitig laufen der eine Benutzer die Credentials des anderen bekommt.

Ich habe im Netz (und hier) nach einer Lösung gesucht, aber entweder ich habe falsch gesucht, niemand hat das Problem oder die Lösung ist sonnenklar und ich sehe sie im Moment nicht. Kann mir jemand sagen, wie man das sicher bewerkstelligt?

Vielen Dank und Gruss
Ben


----------



## maki (2. Apr 2009)

Die HttpSession mitzugeben ist keine gute Idee, denn dadurch wird der Code abhängig davon.

Welche Daten benötigst du denn genau?


----------



## bense (2. Apr 2009)

Ich benötige das Credential-Objekt des Benutzers welches in der Session gespeichert ist. Aber grundsätzlich spielt es ja keine Rolle, was für Daten es sind, oder?


----------



## maki (2. Apr 2009)

Vielleicht kannst du es in ThreadLocal stecken?


----------



## bense (2. Apr 2009)

Also du meinst in meinem Singleton nur ThreadLocal-Vars verwenden? Da jeder Request einen eigenen Thread hat, hat das dann zur Folge, dass jeder Benutzer quasi "seine eigene Instanz des Singletons" hat und die Credentials niemals von einem anderen User benutzt werden können?

Ich möchte nur sichergehen, dass ich das richtig verstanden habe. Sicherheit ist ja schliesslich ein heikles Thema...


----------



## maki (2. Apr 2009)

Kein Singleton.

Sondern die Daten die du brauchst an den Thread hängen.


----------



## bense (2. Apr 2009)

Hmmm, ich muss mich wohl mal etwas damit beschäftigen, habe das noch nie benutzt und weiss nicht genau wie das funktioniert.

Auf jeden Fall Danke!


----------



## bense (2. Apr 2009)

Ich möchte hier gerne nochmals nach haken. Ich habe folgendes beobachtet:
Wenn ich nacheinander 2 Requests vom gleichen Browser auf das Servlet mache, ist es in einigen Fällen so, dass ich bei beiden Requests den gleichen Thread (überprüft mit Thread-ID) bekomme. Somit kann ich dann natürlich auch die ThreadLocal-Vars lesen.

Das lässt bei mir Zweifel aufkommen...GARANTIERT mir das Servlet, dass 2 verschiedene Benutzer bei je einem Request nicht den gleichen Thread bekommen? Sonst wäre die Sache nicht tauglich...


----------



## bense (2. Apr 2009)

Hmm, habe mir das Ganze nochmals überlegt. Ich bin ja selbst dafür verantwortlich. Wenn ich sicherstellen kann, dass in jedem Fall (auch bei evtl. irgendwo auftretenden Fehlern) die ThreadLocal-Vars bei jedem Request gesetzt werden, besteht kein Problem. Das Problem entsteht erst, falls ein anderes Servlet im Container die Vars nicht initialisiert oder irgendwo ein Fehler auftritt welcher die Initialisierung verhindert. Dann hat der Nutzer evtl. die Credentials vom Vorgänger.

Ist zwar auch nicht so ganz sauber, man möchte ja immer auf der sicheren Seite sein, auch falls etwas schief läuft. Aber mir fällt keine andere Lösung ein. Falls jemand eine bessere sieht, wäre ich froh...

Gruss Ben


----------

