2009-06-04 8 views
6

Come posso accedere alle intestazioni delle richieste da un SessionListener?Come posso ottenere HttpServletRequest quando in un HttpSessionListener?

È necessario impostare un timeout sulla sessione corrente al momento della creazione. Il timeout deve variare in base a un'intestazione in HttpServletRequest. Ho già un SessionListener (implementa HttpSessionListener) che registra la creazione e la distruzione di nuove sessioni, e sembra essere il posto più logico per impostare il timeout.

Ho provato quanto segue, ma imposta sempre ctx su null.

FacesContext ctx = FacesContext.getCurrentInstance(); 

risposta

8

Il HttpSessionListener non ha accesso alla richiesta perché è richiamato quando non è stata effettuata alcuna richiesta — per notificare la distruzione della sessione.

Quindi, un Filter o Servlet sarebbero i posti migliori per esaminare la richiesta e specificare il timeout della sessione.

1

Non è possibile (vedere the API). La richiesta consente di accedere alla sessione, ma non viceversa.

Potresti anche avere richieste simultanee per la stessa sessione, quindi non è fattibile.

+3

"Potresti persino avere richieste simultanee per la stessa sessione, quindi non è fattibile." Non sono d'accordo! Solo una richiesta causerà la creazione della sessione per la quale viene attivato "sessionCreated". Questa è una svista nelle specifiche ... per il metodo "sessionCreated" dovresti essere in grado di scoprire quale richiesta ha creato la sessione! –

2
FacesContext ctx = FacesContext.getCurrentInstance(); 

I contesti JSF sono per richiesta e thread-local. Pertanto, questa chiamata al metodo restituirà probabilmente null al di fuori delle chiamate del controller JSF (ad esempio FacesServlet.service), quindi altri thread e tutte le richieste che non passano attraverso il mapping del servlet Faces.

E 'tecnicamente possibile impostare questo time-out utilizzando un meccanismo di JSF - si potrebbe usare un phase listener per verificare la presenza di una sessione dopo RENDER RESPONSE, anche se si sarebbe ancora dovuto cast to the servlet API per impostare il time-out. Il vantaggio degli ascoltatori di fase è che possono essere registrati globalmente in faces-config (see spec) o for specific views. Un ascoltatore di fase globale definito in un JAR con un META-INF/faces-config.xmlpuò essere rilasciato in più WAR, consentendo di riutilizzare facilmente la funzionalità.

(Si potrebbe anche override how the session is provisioned to JSF, ma la quantità di lavoro è eccessivo.)

Per un una tantum, erickson's suggestion di un Filter è davvero semplice.

Problemi correlati