1. 概述

本文是基于前文表单登录基础上的创建的,讲解如何使用Spring Security实现注销功能

2. 基本配置

使用logout()配置Spring注销功能非常简单:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
          //...
          .logout()
          //...
   }
   //...
}

对应的XML配置:

<http>
    ...    
    <logout/>
</http>

Spring Security默认注销URL为/logout(Spring Security 4前为/j_spring_security_logout

3. 添加 “注销” 按钮

在JSP页面中添加 "注销" 超链接:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
   <head></head>
   <body>
      <a href="<c:url value="/logout" />">Logout</a>
   </body>
</html>

4. 高级自定义

4.1. logoutSuccessUrl()

注销成功后,Spring Security会重定向到指定页面。默认情况下,会跳转到根目录(/),但这是可配置的:

//...
.logout()
.logoutSuccessUrl("/afterlogout.html")
//...

也可用XML配置:

<logout logout-success-url="/afterlogout.html" />

每个应用策略有所不同。一个比较好的做法是将用户重定向回登录页面:

//...
.logout()
.logoutSuccessUrl("/login.html")
//...

4.2. logoutUrl()

与Spring Security中的其他配置类似,可以修改默认的注销地址 - /logout

.logout()
.logoutUrl("/perform_logout")

XML方式:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout" />

4.3. invalidateHttpSession 与 deleteCookies

执行注销时,invalidateHttpSession控制是否清空session,默认为truedeleteCookies():要删除的cookie。

.logout()
.logoutUrl("/perform_logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")

XML方式:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID" />

4.4. logoutSuccessHandler()

对于一些高级场景,我们可以自定义LogoutSuccessHandler

@Bean
public LogoutSuccessHandler logoutSuccessHandler() {
    return new CustomLogoutSuccessHandler();
}

//...
.logout()
.logoutSuccessHandler(logoutSuccessHandler());
//...

等效的XML配置:

<logout 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID"
  success-handler-ref="customLogoutSuccessHandler" />

...
<beans:bean name="customUrlLogoutSuccessHandler" />

用户成功注销后需要运行的任何自定义逻辑都可以使用自定义LogoutSuccessHandler来实现。例如,一个简单的审计机制,需要记录用户注销前访问的最后一个页面:

public class CustomLogoutSuccessHandler extends 
  SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {

    @Autowired 
    private AuditService auditService; 

    @Override
    public void onLogoutSuccess(
      HttpServletRequest request, 
      HttpServletResponse response, 
      Authentication authentication) 
      throws IOException, ServletException {
 
        String refererUrl = request.getHeader("Referer");
        auditService.track("Logout from: " + refererUrl);

        super.onLogoutSuccess(request, response, authentication);
    }
}

同时,需要注意:LogoutSuccessHandlelogoutSuccessUrl只能二选一。因为两者功能类似,如果设置了LogoutSuccessHandlerlogoutSuccessUrl设置无效。

5. 总结

本文中,我们首先使用Spring Security配置了一个简单的注销示例,然后讨论了一些更高级的选项。

本文实现源代码存放在GitHub – 这是一个基于Eclipse的项目,所以很容易导入和运行。

项目启动后, 访问http://localhost:8080/spring-security-mvc-login/login.html