java怎么实现自动退出功能_SpringSecurity退出功能实现的正确方式

9ff1c886942833f797703f66df508981.png

本文将介绍在Spring Security框架下如何实现用户的"退出"logout的功能。其实这是一个非常简单的功能,我见过很多的程序员在使用了Spring Security之后,仍然去自己写controller方法实现logout功能,这种做法就好像耕地,你有机械设备你不用,你非要用牛。

一、logout最简及最佳实践

其实使用Spring Security进行logout非常简单,只需要在spring Security配置类配置项上加上这样一行代码:http.logout()。关于spring Security配置类的其他很多实现、如:HttpBasic模式、formLogin模式、自定义登录验证结果、使用权限表达式、session会话管理,在本号的之前的文章已经都写过了。本节的核心内容就是在原有配置的基础上,加上这样一行代码:http.logout()。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.logout();
   }

}

加上logout配置之后,在你的“退出”按钮上使用/logtou作为请求登出的路径。

<a href="/logout" >退出</a>

logout功能我们就完成了。实际上的核心代码只有两行。

二、默认的logout做了什么?

虽然我们简简单单的实现了logout功能,是不是还不足够放心?我们下面就来看一下Spring Security默认在logout过程中帮我们做了哪些动作。

  • 当前session失效,即:logout的核心需求,session失效就是访问权限的回收。
  • 删除当前用户的 remember-me“记住我”功能信息
  • clear清除当前的 SecurityContext
  • 重定向到登录页面,loginPage配置项指定的页面

通常对于一个应用来讲,以上动作就是logout功能所需要具备的功能了。

三、个性化配置

虽然Spring Security默认使用了/logout作为退出处理请求路径,登录页面作为退出之后的跳转页面。这符合绝大多数的应用的开发逻辑,但有的时候我们需要一些个性化设置,如下:

 http.logout()
     .logoutUrl("/signout")
     .logoutSuccessUrl("/aftersignout.html")
     .deleteCookies("JSESSIONID")
  • 通过指定logoutUrl配置改变退出请求的默认路径,当然html退出按钮的请求url也要修改
  • 通过指定logoutSuccessUrl配置,来显式指定退出之后的跳转页面
  • 还可以使用deleteCookies删除指定的cookie,参数为cookie的名称

四、LogoutSuccessHandler

如果上面的个性化配置,仍然满足不了您的应用需求。可能您的应用需要在logout的时候,做一些特殊动作,比如登录时长计算,清理业务相关的数据等等。你可以通过实现LogoutSuccessHandler 接口来实现你的业务逻辑。

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
    
    @Override
    public void onLogoutSuccess(HttpServletRequest request, 
                                HttpServletResponse response, 
                                Authentication authentication) 
                                throws IOException, ServletException {
        //这里书写你自己的退出业务逻辑
        
        // 重定向到登录页
        response.sendRedirect("/login.html");
    }
}

然后进行配置使其生效,核心代码就是一行logoutSuccessHandler。注意logoutSuccessUrl不要与logoutSuccessHandler一起使用,否则logoutSuccessHandler将失效。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
    
@Autowired
    private MyLogoutSuccessHandler myLogoutSuccessHandler;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
         http.logout()
             .logoutUrl("/signout")
             //.logoutSuccessUrl(``"/aftersignout.html"``)
             .deleteCookies("JSESSIONID")
              //自定义logoutSuccessHandler
             .logoutSuccessHandler(myLogoutSuccessHandler);   
   }
}

期待您的关注

  • 向您推荐系列文档:《手摸手教您学习SpringBoot系列-16章97节》
  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 和 Vue.js 实现退出功能的具体实现方式可能因项目具体的架构和需求而有所不同,下面是一种可能的实现方式: 1. 后端实现Spring Boot 后端,可以创建一个 LogoutController 类,提供一个 /logout 的接口。在接口中,可以使用 Spring Securitylogout() 方法来实现退出功能,示例代码如下: ```java @RestController public class LogoutController { @PostMapping("/logout") public void logout(HttpServletRequest request, HttpServletResponse response) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null) { new SecurityContextLogoutHandler().logout(request, response, authentication); } } } ``` 2. 前端实现 在 Vue.js 前端,可以创建一个 logout() 方法,通过 axios 发送一个 POST 请求到后端的 /logout 接口来实现退出功能,示例代码如下: ```javascript methods: { logout() { axios.post('/logout') .then(response => { // 退出成功后的操作,如跳转到登录页面等 }) .catch(error => { console.log(error); }); } } ``` 需要注意的是,在使用 axios 发送 POST 请求时,需要在请求头中添加 CSRF Token,以防止 CSRF 攻击。可以通过在 index.html 中添加以下 meta 标签来获取 CSRF Token: ```html <meta th:name="_csrf" th:content="${_csrf.token}" /> <meta th:name="_csrf_header" th:content="${_csrf.headerName}" /> ``` 在发送 POST 请求时,需要在请求头中添加以下内容: ```javascript axios.interceptors.request.use(config => { config.headers['X-CSRF-TOKEN'] = document.querySelector('meta[name="_csrf"]').content; config.headers['X-CSRF-HEADER'] = document.querySelector('meta[name="_csrf_header"]').content; return config; }); ``` 这样,就可以在 Spring Boot 和 Vue.js 中实现退出功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值