안녕하세요
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을 호출하면 핸들러를 통해 로그아웃 처리가 됩니다.