2009-06-04 5 views
6

Wie kann ich auf Request-Header von einem SessionListener zugreifen?Wie bekomme ich HttpServletRequest in einem HttpSessionListener?

Ich muss ein Timeout für die aktuelle Sitzung festlegen, wenn es erstellt wird. Das Zeitlimit muss basierend auf einer Kopfzeile in der HttpServletRequest variieren. Ich habe bereits einen SessionListener (implementiert HttpSessionListener), der die Erstellung und die Zerstörung neuer Sitzungen protokolliert, und es scheint der logischste Ort zu sein, das Zeitlimit festzulegen.

Ich habe Folgendes versucht, aber es setzt CTX immer auf Null.

FacesContext ctx = FacesContext.getCurrentInstance(); 

Antwort

8

Die HttpSessionListener hat keinen Zugriff auf die Anforderung, da sie aufgerufen wird, wenn keine Anforderung — zum Benachrichtigen der Sitzungszerstörung erfolgt ist.

So ein Filter oder Servlet wäre besser Orte sein, die Anforderung zu untersuchen und das Session-Timeout angeben.

1

Sie können nicht (siehe the API). Mit der Anfrage können Sie auf die Sitzung zugreifen, aber nicht umgekehrt.

Sie könnten sogar gleichzeitige Anfragen für die gleiche Sitzung haben, so dass dies nicht möglich ist.

+3

"Sie könnten sogar gleichzeitige Anfragen für dieselbe Sitzung haben, daher ist dies nicht möglich." Ich stimme nicht zu! Nur eine Anfrage führt dazu, dass die Sitzung erstellt wird, für die "sessionCreated" ausgelöst wurde. Dies ist ein Versehen in der Spezifikation ... für die Methode "sessionCreated" sollten Sie herausfinden können, welche Anfrage die Sitzung erstellt hat! –

2
FacesContext ctx = FacesContext.getCurrentInstance(); 

JSF-Kontexte sind per-Anfrage und Thread-lokal. Daher wird dieser Methodenaufruf wahrscheinlich Null außerhalb der JSF-Controlleraufrufe zurückgeben (z. B. FacesServlet.service) - also andere Threads und alle Anfragen, die das Faces-Servlet-Mapping nicht passieren.

Es ist technisch möglich, diese Zeitüberschreitungs zur Einrichtung eines JSF-Mechanismus - Sie ein phase listener für eine Sitzung nach RENDER RESPONSE zu überprüfen benutzen konnten, obwohl Sie noch cast to the servlet API haben würden das Timeout einzustellen. Der Vorteil von Phasen-Listenern ist, dass sie entweder global in faces-config (see spec) oder for specific views registriert werden können. Ein globaler Phasenlistener, der in einer JAR mit einer META-INF/faces-config.xml definiert ist, kann in mehrere WARs eingefügt werden, sodass Sie die Funktionalität problemlos wiederverwenden können.

(Sie könnten auch override how the session is provisioned to JSF, aber die Menge der Arbeit ist zu hoch.)

Für einen einmaligen, erickson's suggestion ein Filter ist wirklich einfach.