2012-10-10 2 views
9

web.xml에 수신자로 HttpSessionEventPublisher을 추가 한 웹 앱이 있습니다. 웹 응용 프로그램은 Jetty 7.x에서 실행되며 Spring 3.1.1을 사용하고 있습니다.스프링 세션 처리 : HttpSessionDestroyedEvent 수신되지 않았습니다.

스프링 컨텍스트 이벤트 수신기에 HttpSessionCreatedEventHttpSessionDestroyedEvent을 발생시킵니다.

ApplicationListener<ApplicationEvent>을 구현하는 Bean (@Controller)이 있습니다. ApplicationEventHttpSessionCreatedEventHttpSessionDestroyedEvent의 공통 상위 클래스입니다. 이제 웹 응용 프로그램에 로그인하거나 로그 아웃하면이 이벤트가 onApplicationEvent(ApplicationEvent event) 메소드로 실행되기를 기대합니다. 일부 요청 처리 이벤트와 같은 다른 이벤트를 받았지만 예상 이벤트가 표시되지 않았습니다. 응용 프로그램을 약간 추적했지만 HttpSessionEventPublisher은 이벤트를 컨텍스트에 확실히 발생 시키지만 수신기는 접근하지 않습니다. 나는 여기서 무엇을 놓치나요?

답변

8

HttpSessionEventPublisher은 javadoc 당 "Spring Root WebApplicationContext"에 이벤트를 게시합니다. 이는 web.xml 파일의 ContextLoaderListener 항목을 통해 등록 된 응용 프로그램 컨텍스트입니다. 반면 @Controller는 아마도 DispatcherServlet을 통해 등록 된 다른 응용 프로그램 컨텍스트를 통해 등록되었을 것입니다. 그래서 다른 ApplicationListener를 만들고 루트 WebapplicationContext에 등록한 다음 이벤트를 통해 가져와야한다고 제안합니다.

0

비슷한 문제가있어서 ApplicationListener를 루트 컨텍스트로 이동할 수없는 경우 org.springframework.security.context.DelegatingApplicationListener를 사용할 수 있습니다.

는 그냥 콩에 DelegatingApplicationListener를 autowire하기 및 (한 봄 보안에 의해 이미 그 자리에 있어야한다)

DelegatingApplicationListener에 리스너를 등록 할 생성자/@PostConstruct를 사용
관련 문제