2012-10-10 51 views
9

Tengo una aplicación web en la que en web.xml he agregado HttpSessionEventPublisher como oyente. La aplicación web se ejecuta en Jetty 7.x y estamos utilizando Spring 3.1.1.Manejo de sesión de primavera: HttpSessionDestroyedEvent no recibido

Se supone que debe disparar HttpSessionCreatedEvent y HttpSessionDestroyedEvent a los detectores de eventos de contexto Spring.

Tengo un frijol (@Controller) que implementa ApplicationListener<ApplicationEvent>. ApplicationEvent es la clase principal común de HttpSessionCreatedEvent y HttpSessionDestroyedEvent. Cuando inicio sesión en mi aplicación web o cierro sesión, espero que estos eventos se activen en el método onApplicationEvent(ApplicationEvent event). He recibido otros eventos como algún evento de manejo de solicitudes, pero el evento esperado no apareció. He rastreado la aplicación un poco, el HttpSessionEventPublisher definitivamente dispara el evento al contexto, pero el oyente no se acerca. ¿Qué extraño aquí?

Respuesta

8

El problema es que HttpSessionEventPublisher publica eventos en el "Spring Root WebApplicationContext" según el javadoc, este es el contexto de la aplicación registrado a través de la entrada ContextLoaderListener en su archivo web.xml. Por otro lado, su @Controller probablemente esté registrado a través de un contexto de aplicación diferente, el registrado a través del DispatcherServlet. Por lo tanto, le sugiero que cree un ApplicationListener diferente, que lo registre en el Root WebapplicationContext, los eventos deben aparecer luego.

0

Enfrentando un problema similar, si no es posible mover su ApplicationListener al contexto raíz, puede usar org.springframework.security.context.DelegatingApplicationListener.

Sólo Autowire un DelegatingApplicationListener en su Bean y usar constructor/@PostConstruct para registrar su oyente en contra de la DelegatingApplicationListener (uno ya debería estar en funcionamiento en la primavera-seguridad)

Cuestiones relacionadas