2009-06-04 21 views
6

¿Cómo puedo acceder a los encabezados de solicitud desde un SessionListener?¿Cómo puedo obtener HttpServletRequest cuando estoy en HttpSessionListener?

Necesito establecer un tiempo de espera en la sesión actual cuando se crea. El tiempo de espera debe variar según un encabezado en HttpServletRequest. Ya tengo un SessionListener (implementa HttpSessionListener) que registra la creación y destrucción de nuevas sesiones, y parece ser el lugar más lógico para establecer el tiempo de espera.

He intentado lo siguiente, pero siempre establece ctx como nulo.

FacesContext ctx = FacesContext.getCurrentInstance(); 

Respuesta

8

El HttpSessionListener no tiene acceso a la solicitud porque se invoca cuando no se ha realizado ninguna solicitud — para notificar la destrucción de la sesión.

Por lo tanto, un Filter o Servlet serían mejores lugares para examinar la solicitud y especificar el tiempo de espera de la sesión.

1

No es posible (ver the API). La solicitud le permite acceder a la sesión, pero no al revés.

Incluso podría tener solicitudes concurrentes para la misma sesión, por lo que esto no es factible.

+3

"Incluso podría tener solicitudes concurrentes para la misma sesión, por lo que esto no es factible". ¡No estoy de acuerdo! Solo una solicitud causará que se cree la sesión para la cual se haya lanzado "sessionCreated". Esto es un descuido en la especificación ... ¡para el método "sessionCreated" debería poder averiguar qué solicitud creó la sesión! –

2
FacesContext ctx = FacesContext.getCurrentInstance(); 

Los contextos JSF son por solicitud y thread-local. Por lo tanto, esta llamada a método probablemente devolverá null fuera de las invocaciones de controlador JSF (por ejemplo, FacesServlet.service), por lo que otros subprocesos y cualquier solicitud que no pase a través de la asignación de servlets de Faces.

Es técnicamente posible ajustar este tiempo de espera utilizando un mecanismo de JSF - se puede utilizar un phase listener para comprobar si hay una sesión después de RENDER RESPONSE, aunque todavía tendría que cast to the servlet API para establecer el tiempo de espera. La ventaja de los oyentes de fase es que pueden registrarse globalmente en faces-config (see spec) o for specific views. Un oyente de fase global definido en un JAR con un META-INF/faces-config.xml se puede colocar en varios WAR, lo que le permite reutilizar fácilmente la funcionalidad.

(Usted también podría override how the session is provisioned to JSF, pero la cantidad de trabajo es excesiva.)

Para una sola vez, erickson's suggestion de un Filter es realmente sencillo.

Cuestiones relacionadas