본문 바로가기

Java/Spring

Spring Security SessionDestroyListener

스프링 시큐리티에서 세션 디스트로이 이벤트 전후작업 하기.


사용자가 로그아웃할때, 로그를 남겨야한다는 요구사항이 들어왔다.


사용자가 로그아웃 버튼을 클릭해서 로그아웃을 하면, 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을 스프링빈으로 등록한다.