SpringSecurity学习 - 表单退出登录的例子

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

作者:汤圆

个人博客:javalover.cc

简介

前面我们介绍了表单登录的入门案例

本篇介绍下表单退出登录的入门案例,代码基于表单登录的案例进行了修改;

代码地址见文末

目录

  1. 退出登录的基本配置
  2. 退出登录的相关跳转
  3. 退出登录时的缓存更新
  4. 退出登录时的处理器

正文

1. 退出登录的基本配置

最基本的配置如下所示:

1
2
3
4
5
6
java复制代码 @Override
protected void configure(HttpSecurity http) throws Exception {
http
// 退出登录 所有用户都可以访问
.logout().permitAll();
}

这里默认的退出登录url为/logout,通过在url中访问http://localhost:8090/logout就可以退出登录了。

当然最方便的还是在界面中进行链接跳转,如下所示:

1
html复制代码    <a href="logout">退出</a>

2. 退出登录的相关跳转

logoutSuccessUrl配置

退出登录跳转成功后的默认界面是根路径,比如http://localhost:8090/

下面我们可以进行简单的配置,配置成自己指定的界面,如下所示:一般推荐将退出登录成功后跳转的链接设置为登录界面(习惯)

1
2
3
4
5
6
7
java复制代码 @Override
protected void configure(HttpSecurity http) throws Exception {
http
// 退出登录 所有用户都可以访问
.logout().permitAll()
.logoutSuccessUrl("/login");
}

logoutUrl配置:

退出登录跳转的默认url为/logout,比如http://localhost:8090/logout,如果退出登录成功,就跳转到上面配置的路径;

配置如下所示:

1
2
3
4
5
6
7
java复制代码 @Override
protected void configure(HttpSecurity http) throws Exception {
http
// 退出登录 所有用户都可以访问
.logout().permitAll()
.logoutUrl("/logout");
}

3. 退出登录时的缓存更新

这里的缓存指的就是session和cookie;

在退出登录之后,需要将session失效处理,并删除对应的cookie;

对应的命令为:invalidateHttpSession()deleteCookies(...name);

配置如下所示:

其中删除的Cookies名称为JSESSIONID,这个就是前后端交互的一个凭证id,是在第一次前端请求后端时,后端返回的id;后续的请求后端会根据JSESSIONID来匹配对应的session

1
2
3
4
5
6
7
8
9
java复制代码 @Override
protected void configure(HttpSecurity http) throws Exception {
http
// 退出登录 所有用户都可以访问
.logout().permitAll()
.logoutUrl("/logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID");
}

4. 退出登录时的处理器

退出成功后,不仅可以设置特定的url,还可以执行一些自定义的操作;

对应的命令为:logoutSuccessHandler

比如我们需要记录退出登录时访问的最后一个界面,那么可以通过如下的代码来实现;

先定义一个处理器:CustomLogoutSuccessHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
java复制代码
public class CustomLogoutSuccessHandler extends
SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {

@Override
public void onLogoutSuccess(
HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws IOException, ServletException {

String refererUrl = request.getHeader("Referer");
System.out.println("Logout from: " + refererUrl);

super.onLogoutSuccess(request, response, authentication);
}
}

然后在配置中注入该处理器,通过方法注入,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
java复制代码public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Bean
public LogoutSuccessHandler logoutSuccessHandler(){
return new CustomLogoutSuccessHandler();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 退出登录 所有用户都可以访问
.logout()
.permitAll()
.logoutSuccessUrl("/login")
.logoutUrl("/logout")
.logoutSuccessHandler(logoutSuccessHandler());
}

}

这样我们在退出登录时,就可以看到控制台打印下面的内容:

1
bash复制代码Logout from: http://localhost:8090/home

总结

本篇介绍了退出登录的相关配置和处理;

配置有:

  • logoutUrl(): 退出登录链接配置
  • logoutSuccessUrl(): 退出登录成功后的跳转链接
  • invalidateHttpSession: 失效session
  • deleteCookies() : 删除对应cookie,多个cookieName逗号分隔
  • LogoutSuccessHandler:退出登录时执行的相关操作

源码地址

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%