안녕하세요
Spring security에서 로그아웃 처리시 별도 후 처리를 위한 handler를 추가하는 방법입니다.
기존에는 기본으로 제공되는 /j_spring_security_logout 를 사용해서 로그아웃 처리를 했으나 이번에는 별도 handler를 추가 하도록 하겠습니다.
1. CustomLogoutSuccessHandler.java
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomLogoutSuccessHandler implements LogoutSuccessHandler{
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
if (authentication != null && authentication.getDetails() != null) {
try {
request.getSession().invalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
response.setStatus(HttpServletResponse.SC_OK);
response.sendRedirect("/");
}
}
LogoutSuccessHandler 상속받아 onLogoutSuccess 인터페이스를 구현해 줍니다.
로그아웃 요청시 위 handler를 타게 되며 세션을 날리고 메인페이지로 리다이렉트 합니다.
try구문안에 로그아웃시 필요한 후 처리 로직을 넣으면 됩니다.
2. security-context.xml
<http></http> 사이에 로그아웃 설정을 넣어줍니다.
<logout logout-url="/logout" success-handler-ref="logoutSuccessHandler" invalidate-session="false"/>
logout-url을 사용하여 /j_spring_security_logout 대신 /logout을 호출하게 합니다.
success-handler-ref 는 bean id로 </http> 바깥에 추가합니다.
<beans:bean id="logoutSuccessHandler" class="패키지 경로.CustomLogoutSuccessHandler"></beans:bean>
* namespace 설정에 따라 logout 앞에 security:를 붙여야 할수도 있고 beans:를 사용하지 않을수도 있습니다.
invalidate-session="false" 로 설정하면 로그아웃 핸들러까지 새션이 살아서 오고 "true"로 설정하는 경우 세션이 무효화 된 상태로 옵니다.
저는 로그아웃 처리시 session.getAttribute()를 사용하여 값을 꺼내기 위에 false로 설정하였습니다.
위와같이 설정후 /logout을 호출하면 핸들러를 통해 로그아웃 처리가 됩니다.