欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

史上最简单的Spring Security教程(八):用户登出成功LogoutSuccessHandler高级用法

程序员文章站 2022-06-02 17:28:30
...

 

​大多数业务场景下,自定义登出成功页面也满足不了一些要求,更别提默认的登出成功页面。这时候,就需要别的方案支持,幸运的是,Spring Security 框架还真就非常贴心的提供了这样一个接口 LogoutSuccessHandler, 专门用于处理用户登出成功请求。当然了,对于 LogoutSuccessHandler 接口,Spring Security 框架有一些默认的实现,也可以自行扩展。

同用户登录成功的业务场景,在用户登出成功后,我们也要通过邮件、短信、微信,来通知用户,在什么时间,什么地点,退出了系统。更甚至,可以通知用户本次登录都操作了那些功能,做了哪些操作等等。同时,也要把这些信息记录在日志文件中。而这所有的需求,都可以通过实现 LogoutSuccessHandler 接口来实现。

扩展 LogoutSuccessHandler 接口实现发送信息、日志记录。

@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
    super.onLogoutSuccess(request, response, authentication);
​
    this.logger.info(String.format("IP %s,用户 %s, 于 %s 退出系统。", request.getRemoteHost(), authentication.getName(), LocalDateTime.now()));
​
    try {
        // 发邮件
        this.emailService.send();
​
        // 发短信
        this.smsService.send();
​
        // 发微信
        this.weChatService.send();
    } catch (Exception ex) {
        this.logger.error(ex.getMessage(), ex);
    }
}

 

至于其他更高级的信息,如用户本次登录都操作了那些功能,做了哪些操作等等,只要有了接口,有了参数,什么不都好说么?

当然了,Spring Security 配置也需要做一些调整。

......    @Overrideprotected void configure(HttpSecurity http) throws Exception {    http        ......        .authorizeRequests()        .antMatchers("/logout_success").permitAll()        .anyRequest()        .authenticated()        .and()        .logout()        .logoutSuccessHandler(customLogoutSuccessHandler())        .permitAll()    ......}......    public LogoutSuccessHandler customLogoutSuccessHandler() {    CustomLogoutSuccessHandler customLogoutSuccessHandler = new CustomLogoutSuccessHandler();    customLogoutSuccessHandler.setDefaultTargetUrl("/logout_success");    customLogoutSuccessHandler.setEmailService(emailService);    customLogoutSuccessHandler.setSmsService(smsService);    customLogoutSuccessHandler.setWeChatService(weChatService);    return customLogoutSuccessHandler;}......

注意 antMatchers("/logout_success").permitAll() 的顺序,一定要放在 anyRequest().authenticated() 之前。

启动系统,登录,登出,跳转到了登出成功页面。

史上最简单的Spring Security教程(八):用户登出成功LogoutSuccessHandler高级用法

看一下控制台,顺利的发送了相关信息,同时,也打印出了相关日志。

史上最简单的Spring Security教程(八):用户登出成功LogoutSuccessHandler高级用法

 

源码

 

github

 

https://github.com/liuminglei/SpringSecurityLearning/tree/master/08

 

gitee

 

https://gitee.com/xbd521/SpringSecurityLearning/tree/master/08

 

 

 

史上最简单的Spring Security教程(八):用户登出成功LogoutSuccessHandler高级用法

回复以下关键字,获取更多资源

 

SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲

史上最简单的Spring Security教程(八):用户登出成功LogoutSuccessHandler高级用法

 

 

 

 

笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。

史上最简单的Spring Security教程(八):用户登出成功LogoutSuccessHandler高级用法