【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)

文章目录

    • 前言
    • 参考目录
    • 代码分析
      • `StpLogic#logout`
        • 1、获取当前用户 token,判断是否存在
            • `StpLogic#getTokenValue`
            • `StpLogic#getTokenValueNotCut`
        • 2、从当前【storage 存储器】里删除
            • `SaTokenContextForSpring#getStorage`
            • `StpLogic#splicingKeyJustCreatedSave`
            • `SaStorageForServlet#delete`
        • 3、判断配置,把 cookie 清除掉
        • 4、清除 token 的相关信息
            • `StpLogic#logoutByTokenValue`
          • 4.1、清理 token-last-activity
            • `StpLogic#clearLastActivity`
          • 4.2、注销 Token-Session
            • `StpLogic#deleteTokenSession`
          • 4.3、根据 token 获取 loginId,清理 token-id 索引
            • `StpLogic#getLoginIdNotHandle`
          • 4.4、通知监听器,某某 Token 注销下线了
            • `UserActionListener#doLogout`
          • 4.5、清理 User-Session 上的 token 签名 & 尝试注销 User-Session

前言

前两篇文章简单分析了一下登录以及通过注解校验权限的流程,有登录就有登出,所以这篇文章就来分析一下登出的流程源码。

参考目录

  • Sa-Token 官方文档

代码分析

请求接口:SysLoginController#logout
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第1张图片
方法很简单,就一行代码。看看官方文档的说法:

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第2张图片
强制注销等价于对方主动调用了注销方法,再次访问会提示:Token无效。

StpLogic#logout

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第3张图片
方法的步骤主要有以下几点:

  • 如果连token都没有,那么无需执行任何操作
  • 从当前 [storage存储器] 里删除
  • 如果打开了Cookie模式,则把cookie清除掉
  • 清除这个token的相关信息

下面来对每一步骤进行 Debug 分析。

1、获取当前用户 token,判断是否存在

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第4张图片

StpLogic#getTokenValue

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第5张图片
获取 token 的方法,在登录流程里面也有用到这个方法。

StpLogic#getTokenValueNotCut

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第6张图片
从请求头中获取到 token (未裁剪前缀) 并返回。
在这里插入图片描述
去掉前缀,得到最终的 token 并返回到上一级。
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第7张图片
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第8张图片
token 不为空,继续执行下面的代码。

2、从当前【storage 存储器】里删除

在这里插入图片描述
先获取 storage 存储器。
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第9张图片

SaTokenContextForSpring#getStorage

实际上就是根据 request 请求数据 new 了一个 SaStorageForServlet
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第10张图片
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第11张图片

StpLogic#splicingKeyJustCreatedSave

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第12张图片

SaStorageForServlet#delete

在这里插入图片描述

3、判断配置,把 cookie 清除掉

配置文件:
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第13张图片
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第14张图片
没有配置 Cookie 模式,继续执行下面的代码。

4、清除 token 的相关信息

StpLogic#logoutByTokenValue

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第15张图片

4.1、清理 token-last-activity
StpLogic#clearLastActivity

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第16张图片
判断是否是用不过期:false(配置时间是 1800 秒)。

删除最后操作时间:
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第17张图片
清除标记,调用 storage 存储器删除 request 中的值。
在这里插入图片描述
完成操作返回上一级。

4.2、注销 Token-Session
StpLogic#deleteTokenSession

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第18张图片

4.3、根据 token 获取 loginId,清理 token-id 索引
StpLogic#getLoginIdNotHandle

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第19张图片
loginId 值为 sys_user:1
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第20张图片
删除 token-id 映射。
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第21张图片

4.4、通知监听器,某某 Token 注销下线了
UserActionListener#doLogout

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第22张图片
控制台输出:
在这里插入图片描述

4.5、清理 User-Session 上的 token 签名 & 尝试注销 User-Session

【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第23张图片
移除 session 中的相关信息:
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第24张图片
至此 StpLogic#logout 方法全部执行完成。用户退出成功:
【RuoYi-Vue-Plus】学习笔记 13 - Sa-Token(三)退出登录流程(Sa-Token 源码)_第25张图片

你可能感兴趣的:(框架学习,-,若依,/,RuoYi-Vue-Plus,#,Sa-Token,RuoYi-Vue-Plus,java,后端,Sa-Token)