大多数业务场景下,自定义登出成功页面也满足不了一些要求,更别提默认的登出成功页面。这时候,就需要别的方案支持,幸运的是,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() 之前。
启动系统,登录,登出,跳转到了登出成功页面。
看一下控制台,顺利的发送了相关信息,同时,也打印出了相关日志。
https://github.com/liuminglei/SpringSecurityLearning/tree/master/08
https://gitee.com/xbd521/SpringSecurityLearning/tree/master/08
回复以下关键字,获取更多资源
SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲
笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。