2012-10-10 18 views
9

Ho un'app Web in cui nello web.xml ho aggiunto il listener HttpSessionEventPublisher. L'app Web viene eseguita su Jetty 7.x e stiamo utilizzando Spring 3.1.1.Gestione sessione primaverile: HttpSessionDestroyedEvent non ricevuto

Questo dovrebbe far scattare HttpSessionCreatedEvent e HttpSessionDestroyedEvent ai listener di eventi di contesto Spring.

Ho un bean (@Controller) che implementa ApplicationListener<ApplicationEvent>. ApplicationEvent è la classe padre comune di HttpSessionCreatedEvent e HttpSessionDestroyedEvent. Quando accedo ora alla mia applicazione Web o esci da esso, mi aspetto che questi eventi vengano attivati ​​nel metodo onApplicationEvent(ApplicationEvent event). Ho ricevuto altri eventi come un evento di gestione delle richieste, ma l'evento previsto non si è verificato. Ho rintracciato l'app un po ', il HttpSessionEventPublisher sicuramente spara l'evento al contesto, ma il listener non viene avvicinato. cosa mi manca qui?

risposta

8

Il problema è che HttpSessionEventPublisher pubblica gli eventi sul "Spring Root WebApplicationContext" per javadoc, questo è il contesto dell'applicazione registrato tramite la voce ContextLoaderListener nel file web.xml. Il tuo @Controller d'altra parte è probabilmente registrato attraverso un contesto applicativo diverso, quello registrato attraverso DispatcherServlet. Quindi suggerirei di creare un ApplicationListener diverso, registrarlo su Root WebapplicationContext, quindi gli eventi dovrebbero passare.

0

Di fronte a un problema simile, se non è possibile spostare ApplicationListener nel contesto radice, è possibile utilizzare org.springframework.security.context.DelegatingApplicationListener.

Basta autowire un DelegatingApplicationListener nella vostra Bean e utilizzare il costruttore/@PostConstruct per registrare il vostro ascoltatore contro il DelegatingApplicationListener (uno dovrebbe essere già in atto entro la primavera-sicurezza)

Problemi correlati