SpringSecurity学习 - 表单退出登录的例子

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

作者:汤圆

个人博客:javalover.cc

简介

前面我们介绍了表单登录的入门案例

本篇介绍下表单退出登录的入门案例,代码基于表单登录的案例进行了修改;

代码地址见文末

目录

  1. 退出登录的基本配置
  2. 退出登录的相关跳转
  3. 退出登录时的缓存更新
  4. 退出登录时的处理器

正文

1. 退出登录的基本配置

最基本的配置如下所示:

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 退出登录 所有用户都可以访问
            .logout().permitAll();
    }
复制代码

这里默认的退出登录url为/logout,通过在url中访问http://localhost:8090/logout就可以退出登录了。

当然最方便的还是在界面中进行链接跳转,如下所示:

    <a href="logout">退出</a>
复制代码

2. 退出登录的相关跳转

logoutSuccessUrl配置

退出登录跳转成功后的默认界面是根路径,比如http://localhost:8090/

下面我们可以进行简单的配置,配置成自己指定的界面,如下所示:一般推荐将退出登录成功后跳转的链接设置为登录界面(习惯)

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 退出登录 所有用户都可以访问
            .logout().permitAll() 
            .logoutSuccessUrl("/login");
    }
复制代码

logoutUrl配置:

退出登录跳转的默认url为/logout,比如http://localhost:8090/logout,如果退出登录成功,就跳转到上面配置的路径;

配置如下所示:

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 退出登录 所有用户都可以访问
            .logout().permitAll() 
            .logoutUrl("/logout");
    }
复制代码

3. 退出登录时的缓存更新

这里的缓存指的就是session和cookie;

在退出登录之后,需要将session失效处理,并删除对应的cookie;

对应的命令为:invalidateHttpSession()deleteCookies(...name);

配置如下所示:

其中删除的Cookies名称为JSESSIONID,这个就是前后端交互的一个凭证id,是在第一次前端请求后端时,后端返回的id;后续的请求后端会根据JSESSIONID来匹配对应的session

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 退出登录 所有用户都可以访问
            .logout().permitAll() 
            .logoutUrl("/logout")
            .invalidateHttpSession(true)
            .deleteCookies("JSESSIONID");
    }
复制代码

4. 退出登录时的处理器

退出成功后,不仅可以设置特定的url,还可以执行一些自定义的操作;

对应的命令为:logoutSuccessHandler

比如我们需要记录退出登录时访问的最后一个界面,那么可以通过如下的代码来实现;

先定义一个处理器:CustomLogoutSuccessHandler.java


public class CustomLogoutSuccessHandler extends
        SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {

    @Override
    public void onLogoutSuccess(
            HttpServletRequest request,
            HttpServletResponse response,
            Authentication authentication)
            throws IOException, ServletException {

        String refererUrl = request.getHeader("Referer");
        System.out.println("Logout from: " + refererUrl);

        super.onLogoutSuccess(request, response, authentication);
    }
}
复制代码

然后在配置中注入该处理器,通过方法注入,如下所示:

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Bean
    public LogoutSuccessHandler logoutSuccessHandler(){
        return new CustomLogoutSuccessHandler();
    }
     @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 退出登录 所有用户都可以访问
            .logout()
                .permitAll()
                .logoutSuccessUrl("/login")
                .logoutUrl("/logout")
                .logoutSuccessHandler(logoutSuccessHandler());
    }

}

复制代码

这样我们在退出登录时,就可以看到控制台打印下面的内容:

Logout from: http://localhost:8090/home
复制代码

总结

本篇介绍了退出登录的相关配置和处理;

配置有:

  • logoutUrl(): 退出登录链接配置
  • logoutSuccessUrl(): 退出登录成功后的跳转链接
  • invalidateHttpSession: 失效session
  • deleteCookies() : 删除对应cookie,多个cookieName逗号分隔
  • LogoutSuccessHandler:退出登录时执行的相关操作

源码地址

Guess you like

Origin juejin.im/post/7032214530214068261