Java/Spring
Spring Security SessionDestroyListener
jason.moon
2018. 3. 26. 13:37
스프링 시큐리티에서 세션 디스트로이 이벤트 전후작업 하기.
사용자가 로그아웃할때, 로그를 남겨야한다는 요구사항이 들어왔다.
사용자가 로그아웃 버튼을 클릭해서 로그아웃을 하면, SimpleUrlLogoutSuccessHandler를 상속받아 onLogoutSuccess 메서드를 구현해서 처리할 수 있다.
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
// 전 작업
super.onLogoutSuccess(request, response, authentication);
}
여기서 문제는, 사용자가 로그아웃 버튼을 클릭해서 로그인을 하는것이 아니라 세션이 만료되어 로그아웃될때를 잡아야 한다.
세션 만료 이벤트를 잡아서 처리하려면, ApplicationListener<SessionDestroyedEvent>를 구현하여 처리할 수 있다.
public class SessionDestroyListener implements ApplicationListener<SessionDestroyedEvent> {
@Override
public void onApplicationEvent(SessionDestroyedEvent event) {
List<SecurityContext> securityContexts = event.getSecurityContexts();
for (SecurityContext securityContext : securityContexts) {
// 세션 만료시 작업.
}
}
}
web.xml에 아래 리스너를 등록한다.
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
그리고 SessionDestroyListen을 스프링빈으로 등록한다.