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

 

​大多数业务场景下,自定义登出成功页面也满足不了一些要求,更别提默认的登出成功页面。这时候,就需要别的方案支持,幸运的是,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() 之前。

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

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

 

源码

 

github

 

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

 

gitee

 

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

 

 

 

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

 

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

 

 

 

 

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

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值