注销登录

SpringScurity中提供了默认的注销页面,当然我们也可以根据自己的需求对注销登录进行定制。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().logout().logoutUrl("/logout").invalidateHttpSession(true).clearAuthentication(true).logoutSuccessUrl("/login.html").permitAll().and().csrf().disable();}
}

(1)、logout:开启注销登录配置

(2)、logoutUrl:指定了注销登录的请求地址,默认是GET,路径为/logout

(3)、invalidateHttpSession:表示是否使session失效,默认为true

(4)、clearAuthentication:表示是否清楚认证信息,默认为true

(5)、logoutSuccessUrl:表示注销登录之后的跳转地址。


配置完成后,再次启动项目,登录成功之后,在浏览器中输入http://localhost:8080/logout就可以发起注销登录请求了。注销登录成功后,会自动跳转到login.html页面。

如果项目有需要,开发者也可以配置多个注销登录的请求,同时还可以指定请求的方法:

@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login.html").loginProcessingUrl("/doLogin").successHandler(new MyAuthenticationSuccessHandler()).failureHandler(new MyAuthenticationFailureHandler()).usernameParameter("uname").passwordParameter("passwd").permitAll().and().logout().logoutUrl("/logout")
//                .invalidateHttpSession(true).logoutRequestMatcher(new OrRequestMatcher(new AntPathRequestMatcher("/logout1", "GET"),new AntPathRequestMatcher("/logout2", "POST"))).clearAuthentication(true).logoutSuccessUrl("/login.html").and().csrf().disable();}

上面配置表示注销登录路径有两个:

  • 第一个是/logout1,请求方法是GET
  • 第二个是/logout2,请求方法是POST

使用任意一个请求都可以完成登录注销。

如果是前后的分离的架构,注销登录成功后就不需要页面跳转了,只需要将注销成功的信息返回给前端即可,此时我们额可以自定义返回内容。

 @Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login.html").loginProcessingUrl("/doLogin").successHandler(new MyAuthenticationSuccessHandler()).failureHandler(new MyAuthenticationFailureHandler()).usernameParameter("uname").passwordParameter("passwd").permitAll().and().logout().logoutUrl("/logout")
//                .invalidateHttpSession(true).logoutRequestMatcher(new OrRequestMatcher(new AntPathRequestMatcher("/logout1", "GET"),new AntPathRequestMatcher("/logout2", "POST"))).logoutSuccessHandler((req,res,aut)->{res.setContentType("application/json;charset=utf-8");HashMap<String,Object> resp = new HashMap<>();resp.put("status",200);resp.put("msg","注销成功!");ObjectMapper om = new ObjectMapper();final String writeValueAsString = om.writeValueAsString(resp);res.getWriter().write(writeValueAsString);}).clearAuthentication(true).and().csrf().disable();}

配置logoutSuccessHandler和logoutSuccessUrl类似前面所介绍的successHandler和defaultSuccessUrl之间的关系,只是类不同而已,这里就不在细说了,有兴趣的朋友可以参考一下前面两篇文章。


配置完成后,启动项目,登录成功后去注销登录,无论是使用/logout1还是/logout2进行注销,只要注销成功,就会返回一段JSON字符串,如果我们希望为不同的注销地址返回不同的结果,可以参考如下:

 @Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login.html").loginProcessingUrl("/doLogin").successHandler(new MyAuthenticationSuccessHandler()).failureHandler(new MyAuthenticationFailureHandler()).usernameParameter("uname").passwordParameter("passwd").permitAll().and().logout().logoutUrl("/logout")
//                .invalidateHttpSession(true).logoutRequestMatcher(new OrRequestMatcher(new AntPathRequestMatcher("/logout1", "GET"),new AntPathRequestMatcher("/logout2", "POST"))).defaultLogoutSuccessHandlerFor((req,res,auth)->{res.setContentType("application/json;charset=utf-8");HashMap<String,Object> resp = new HashMap<>();resp.put("status",200);resp.put("msg","logout1注销成功!");ObjectMapper om = new ObjectMapper();final String writeValueAsString = om.writeValueAsString(resp);res.getWriter().write(writeValueAsString);},new AntPathRequestMatcher("/logout1","GET")).defaultLogoutSuccessHandlerFor((req,res,auth)->{res.setContentType("application/json;charset=utf-8");HashMap<String,Object> resp = new HashMap<>();resp.put("status",200);resp.put("msg","logout2注销成功!");ObjectMapper om = new ObjectMapper();final String writeValueAsString = om.writeValueAsString(resp);res.getWriter().write(writeValueAsString);},new AntPathRequestMatcher("/logout2","POST")).clearAuthentication(true).logoutSuccessUrl("/login.html").and().csrf().disable();}

通过defaultLogoutSuccessHandlerFor方法可以注册多个不同的注销成功回调函数,该方法第一个参数是注销成功回调,第二个参数是具体的注销请求。当用户注销成功后,使用了哪个注销请求,就会给出对象的相应。

SpringSecurity(六)注销登录相关推荐

  1. QT开发(六十六)——登录对话框的验证机制

    QT开发(六十六)--登录对话框的验证机制 一.验证码机制 为了避免被恶意程序***,程序通常要使用安全机制.验证码机制是提供产生随机验证码,由用户识别填写来判断用户有效性的安全机制. 验证码必须动态 ...

  2. Springsecurity搭建自定义登录页面

    Springsecurity搭建自定义登录页面 1.springSecurity的搭建 新建一个springboot的web项目,我这边只选中了web,建立后如下: image.png pom依赖: ...

  3. 用户登录色一句java_SpringBoot中用SpringSecurity实现用户登录并返回其拥有哪些角色...

    注:在使用springsecurity之前我们用普通的登录方式 - _1 v2 C4 a8 h, m8 h6 q2 q+ l: [1.前端发来登录请求会带上username,password: M) ...

  4. Linux自动注销登录的帐户

    曾经碰到一个事情,一个好朋友用我的机器登录到服务器,然后忘记退出了,我呢不知情,所以在下班的时候,直接在命令行就poweroff了,于是乎,服务器就被poweroff掉了..今天在网上发现有解决方法, ...

  5. linux注销登录用户

    linux注销登录用户  然后删除该用户 如下: 进入根用户 su 或者 su - root 查看当前在线用户 w 或者 who -a USER     TTY      FROM           ...

  6. logout 注销登录

    logout就是退出呢登录的shell,即注销登录的意思,命令行直接输入logout,登录就会被注销,回到了登录页面,其语法格式如下: [root@Centos8 ~]# logout logout与 ...

  7. 厉害,我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证

    小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...

  8. oauth2.0 注销登录再次访问authorize授权接口会跳过登录页面问题解决

    [重要提示,该种做法纯属技术理解和技术探索,禁止用于生产环境!因为违背了oauth2.0自动认证的宗旨!会导致无法自动登录问题] [禁止用于生产环境] [禁止用于生产环境] [禁止用于生产环境] [禁 ...

  9. SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面

    SpringSecurity的简单概述 是什么:SpringSecurity融合Spring技术栈,提供JavaEE应 用的整体安全解决方案:提供全面的安全服务 有什么用:可以进行身份验证,就是证明你 ...

最新文章

  1. 云栖小镇不是“镇”,就像中关村不是“村”。小镇是一个符号,就像起建于50年前的硅谷的“谷”,和100年前爱迪生所在的门洛公园。...
  2. docker删除image失败,conflict
  3. 【SpringCloud】Feigin-实例
  4. OpenCV下设置灰度直方图的阈值来对图像进行查找(查表)变换的源码
  5. 文档型数据库设计模式-如何存储树形数据
  6. 云给数据中心带来了什么特性?
  7. ADO Execute 方法
  8. git 拉代码_一篇文章理清Git
  9. 后台getshell常用技巧总结
  10. html 查找添加联系人,使用phonegap查找联系人的实现方法
  11. LeetCode 61旋转链表-中等
  12. iOS  Emoji表情编码/解码
  13. nginx apache 服务器配置
  14. 手机锁屏js倒计时停止问题解决办法探索
  15. 浅入MFC之对话框及MFC程序的运行
  16. 【老孙随笔】想学程序设计,先学人生设计!
  17. call、aplay 和 bind 三者之间的区别?
  18. Linux命令行配置网络(有线网络,无线网络)// Debian
  19. linux下iso镜像的制作工具,ISO镜像文件制作转换工具(AnyToISO)
  20. mybatis sql语句格式化 trim prefix suffix

热门文章

  1. Vue.js仿饿了么外卖App--(4)商品详情页实现
  2. 干货分享:小程序项目实践和经验总结
  3. 零基础入门小程序,实战经验分享
  4. 计算机考研854题型,2020哈尔滨工业大学计算机考研854真题回忆版
  5. 进入2.0阶段!从阿里大鱼买断军事大V看内容平台的生态之争
  6. Js高级-函数的理解
  7. 网络笔记--交换机和路由器
  8. 易班自动打卡+钉钉机器人消息提醒
  9. matlab冲激激励,实验一 阶跃响应与冲激响应.doc
  10. python爬虫实战-网易BUFF CSGO饰品