2012-04-05 6 views
0

Dies ist eine ziemlich grundlegende Frage. Ich lerne von einem Lehrbuch über JSF-Web-Apps und verwende eine @ SessionObject-Bean, um die Sitzung zu verwalten. Das Buch erwähnt, dass wenn Sie den Browser schließen, die Sitzung endet, und dies war einfach mit Tests zu überprüfen. Ich bin mir aber nicht sicher, wie die Web-App darüber informiert wird, dass der Browser geschlossen und wieder geöffnet wurde. Ich konnte keine lokalen Cookies finden. Wie erhält die Web-App diese Informationen?Wie weiß die Java Web-App mit @SessionScoped Bean, ob der Browser neu gestartet wurde?

Danke!

+0

Verwandte: http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading/3106909#3106909 – BalusC

+0

Wenn Sie den Browser, die Sitzung bleibt in der Nähe !! !! Es tritt schließlich aufgrund eines maximalen inaktiven Intervalls aus und wird aus einer Hintergrund-HashMap (angenommene Implementierungsdetail) entfernt, die die SessionID dem Session-Objekt zuordnet. – MJB

+0

@MJB, Es gibt mindestens zwei Arten von Sitzungen. Der HTTP-Server, auf dem Benutzerdaten und die Browsersitzung gespeichert werden. Denken Sie an den Lebenszyklus des Browsers seit dem Start und bis es geschlossen wurde. Willst du das fangen? Dann erstellen Sie einen Sitzungscookie und überprüfen, ob die neue Browsersitzung gestartet wurde oder nicht. – ahanin

Antwort

1

Es ist ein Session Cookie, das die Magie tut.

+0

Danke. Die andere seltsame Sache ist, dass ich im Code der erstellten einfachen Seite nichts sah, was andeutete, dass ein Cookie erstellt wurde. Vielleicht erstellt der Web-App-Server (Glassfish) bei Verwendung von @SessionScoped standardmäßig grundlegende Sitzungscookies? Scheint auch noch seltsam, ich konnte den Cookie in meiner Firefox-Cookie-Datenbank nicht finden, aber vielleicht habe ich nicht richtig gesucht. – The111

+1

Ich denke, sie sind speicherintern, Sie können Anforderungsheader mit Hilfe von FireBug einfach überprüfen. Sie sollten dort Ihren Cookie sehen. – ahanin

0

In der Tat, wenn Sie auf einer Webseite Ihrer Anwendung ankommen, starten Sie eine http-Sitzung. Dann speichert Ihr Browser eine sessionId, die als Kennung für folgende Anfragen verwendet wird.

Also, wenn der Browser geschlossen ist, gibt es keine Möglichkeit, dass Ihre Anwendung davon weiß.

Die einzige Möglichkeit, die Sitzung von der Serverseite aus zu beenden, besteht darin, in der Datei "web.xml" ein Zeitlimit einzurichten. Wenn vor dem Auslösen des Timeouts keine Anfrage an den Browser gesendet wird, werden alle Methoden in den verwalteten Beans dieser Sitzung, die mit @PreDestroy kommentiert wurden, aufgerufen, und dann wird auf der Serverseite alles bereinigt.

Verwandte Themen