史上最简单的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 配置也需要做一些调整。
......
@Override
protected 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 精讲
笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。
下一篇: 精选十个微信公众号推广吸引粉丝方法