SaToken学习笔记-02
SaToken学习笔记-02
如果排版有问题,请点击:传送门
常用的登录有关的方法
- StpUtil.logout()
作用为:当前会话注销登录
调用此方法,其实做了哪些操作呢,我们来一起看一下源码
/**
* 当前会话注销登录
*/
public static void logout() {
stpLogic.logout();
}
一开始调用了stpLogic.logout()方法
什么是stpLogic?
stpLogic是在StpUtil类中定义的一个底层的StpLogic对象
public static StpLogic stpLogic = new StpLogic("login");
并且把stpLogic的loginkey设置为login,在创建对象时会在 SaTokenManager 中记录下此 StpLogic,以便根据 LoginKey 进行查找此对象
继续进入
/**
* 当前会话注销登录
*/
public void logout() {
// 如果连token都没有,那么无需执行任何操作
String tokenValue = getTokenValue();
if(tokenValue == null) {
return;
}
// 如果打开了cookie模式,第一步,先把cookie清除掉
if(getConfig().getIsReadCookie() == true){
SaHolder.getResponse().deleteCookie(getTokenName());
}
logoutByTokenValue(tokenValue);
}
可以看到,首先取到tokenvalue的值,判断token是否为空,如果为空就直接结束,表示此用户已经为非登录状态。接着通过调用getIsReadCookie()方法返回isReadCookie的常量值,默认为true。判断如果返回的值为true则表示打开了Cookie模式,使用deleteCookie()方法通过传入的token清楚对应的Cookie。最后调用logoutByTokenValue(tokenValue);对指定的token的会话注销登录。
/**
* 指定token的会话注销登录
* @param tokenValue 指定token
*/
public void logoutByTokenValue(String tokenValue) {
// 1. 清理掉[token-最后操作时间]
clearLastActivity(tokenValue);
// 2. 清理Token-Session
SaManager.getSaTokenDao().delete(splicingKeyTokenSession(tokenValue));
// 3. 尝试清除token-id键值对 (先从db中获取loginId值,如果根本查不到loginId,那么无需继续操作 )
String loginId = getLoginIdNotHandle(tokenValue);
if(loginId == null || NotLoginException.ABNORMAL_LIST.contains(loginId)) {
return;
}
SaManager.getSaTokenDao().delete(splicingKeyTokenValue(tokenValue));
// $$ 通知监听器
SaManager.getSaTokenListener().doLogout(loginKey, loginId, tokenValue);
// 4. 尝试清理User-Session上的token签名 (如果为null或已被标记为异常, 那么无需继续执行 )
SaSession session = getSessionByLoginId(loginId, false);
if(session == null) {
return;
}
session.removeTokenSign(tokenValue);
// 5. 尝试注销User-Session
session.logoutByTokenSignCountToZero();
}
清除token最后操作时间,session,token和loginid的键值对信息。然后通知监听器输出用户登出的消息。清理Session上的token签名,最后调用logoutByTokenSignCountToZero()注销Session
/** 当Session上的tokenSign数量为零时,注销会话 */
public void logoutByTokenSignCountToZero() {
if (tokenSignList.size() == 0) {
logout();
}
}
至此logout()操作进行完毕,总的来说不是很复杂
- StpUtil.checkLogin()
实现功能为:检验当前会话是否已经登录, 如果未登录,则抛出异常:NotLoginException
对NotLoginException异常,官方做了相关扩展:
扩展:NotLoginException 对象可通过 getLoginKey() 方法获取具体是哪个 StpLogic 抛出的异常
扩展:NotLoginException 对象可通过 getType() 方法获取具体的场景值,详细参考章节:未登录场景值
个人使用场景:
@RequestMapping("/checkLogin")
public void CheckLogin(){
try{
StpUtil.checkLogin();
System.out.println("该用户已经成功登录");
}catch (NotLoginException e)
{
System.out.println("该用户未登录");
String loginkey = e.getLoginKey();
String type = e.getType();
System.out.println("loginkey=>"+loginkey+",type=>"+type);
}
}
开始源码查看
/**
* 检验当前会话是否已经登录,如未登录,则抛出异常
*/
public static void checkLogin() {
stpLogic.checkLogin();
}
调用了stpLogic的checkLogin方法,继续深入
/**
* 检验当前会话是否已经登录,如未登录,则抛出异常
*/
public void checkLogin() {
getLoginId();
}
没什么好说的,继续点进去
/**
* 获取当前会话账号id, 如果未登录,则抛出异常
* @return 账号id
*/
public Object getLoginId() {
// 如果正在[临时身份切换], 则返回临时身份
if(isSwitch()) {
return getSwitchLoginId();
}
// 如果获取不到token,则抛出: 无token
String tokenValue = getTokenValue();
if(tokenValue == null) {
throw NotLoginException.newInstance(loginKey, NotLoginException.NOT_TOKEN);
}
// 查找此token对应loginId, 如果找不到则抛出:无效token
String loginId = getLoginIdNotHandle(tokenValue);
if(loginId == null) {
throw NotLoginException.newInstance(loginKey, NotLoginException.INVALID_TOKEN);
}
// 如果是已经过期,则抛出已经过期
if(loginId.equals(NotLoginException.TOKEN_TIMEOUT)) {
throw NotLoginException.newInstance(loginKey, NotLoginException.TOKEN_TIMEOUT);
}
// 如果是已经被顶替下去了, 则抛出:已被顶下线
if(loginId.equals(NotLoginException.BE_REPLACED)) {
throw NotLoginException.newInstance(loginKey, NotLoginException.BE_REPLACED);
}
// 如果是已经被踢下线了, 则抛出:已被踢下线
if(loginId.equals(NotLoginException.KICK_OUT)) {
throw NotLoginException.newInstance(loginKey, NotLoginException.KICK_OUT);
}
// 检查是否已经 [临时过期]
checkActivityTimeout(tokenValue);
// 如果配置了自动续签, 则: 更新[最后操作时间]
if(getConfig().getAutoRenew()) {
updateLastActivityToNow(tokenValue);
}
// 至此,返回loginId
return loginId;
}
ok,首先判断是否正在进行临时身份切换,这个之前解析过了。之后取到当前的token值,如果找不到就抛出NotLoginException异常,如果找到了就通过token返回对应的loginId,同样判断是否loginId有值,如果没有就返回异常。之后判断是否loginId已经过期,是否已经被顶替,是否被踢下线,满足任意一项就抛出NotLoginException的异常。最后检查是否token已经过期,并且对token重新设置了最后操作时间,返回loginId。
同样没什么复杂的,下面查看异常的Instance方法做了什么
/**
* 静态方法构建一个NotLoginException
* @param loginKey loginKey
* @param type 场景类型
* @return 构建完毕的异常对象
*/
public static NotLoginException newInstance(String loginKey, String type) {
String message = null;
if(NOT_TOKEN.equals(type)) {
message = NOT_TOKEN_MESSAGE;
}
else if(INVALID_TOKEN.equals(type)) {
message = INVALID_TOKEN_MESSAGE;
}
else if(TOKEN_TIMEOUT.equals(type)) {
message = TOKEN_TIMEOUT_MESSAGE;
}
else if(BE_REPLACED.equals(type)) {
message = BE_REPLACED_MESSAGE;
}
else if(KICK_OUT.equals(type)) {
message = KICK_OUT_MESSAGE;
}
else {
message = DEFAULT_MESSAGE;
}
return new NotLoginException(message, loginKey, type);
}
不难看出通过传入的loginKey和type给变量mssage也就是错误信息赋上不同对应的错误信息。最后调用NotLoginException的构造函数传入确定的message,loginKey,type返回异常。
总体上来说,干了什么还是一目了然的,并不是很难看懂。
END
SaToken学习笔记-02的更多相关文章
- 软件测试之loadrunner学习笔记-02集合点
loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...
- 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)
机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...
- OpenCV 学习笔记 02 使用opencv处理图像
1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...
- SaToken学习笔记-04
SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...
- SaToken学习笔记-03
SaToken学习笔记-03 如果排版有问题,请点击:传送门 核心思想 所谓权限验证,验证的核心就是一个账号是否拥有一个权限码 有,就让你通过.没有?那么禁止访问! 再往底了说,就是每个账号都会拥有一 ...
- SaToken学习笔记-01
SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...
- Redis:学习笔记-02
Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...
- OGG学习笔记02
实验环境:源端:192.168.1.30,Oracle 10.2.0.5 单实例目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1.模拟源数据库业务持续运行 2.配置OGG前 ...
- 《Master Bitcoin》学习笔记02——比特币的交易模型
比特币的交易模型 模型基本描述 前面一篇学习笔记01提到了一个交易模型(第三章的内容),在第五章中,除了对这个模型做个详细介绍之外,其实和我上一篇理解的交易模型差不多,一个交易包含输入与输出,比特币是 ...
随机推荐
- 27、Tomcat服务的安装与配置
服务器名称 ip地址 slave-node1 172.16.1.91 27.1. Tomcat简介: Tomcat是Apache软件基金会(Apache Software Foundation)的Ja ...
- __sync_fetch_and_add函数(Redis源码学习)
__sync_fetch_and_add函数(Redis源码学习) 在学习redis-3.0源码中的sds文件时,看到里面有如下的C代码,之前从未接触过,所以为了全面学习redis源码,追根溯源,学习 ...
- AcWing 1273. 天才的记忆
从前有个人名叫 WNB,他有着天才般的记忆力,他珍藏了许多许多的宝藏. 在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏. 题目是这样的:给你一大串 ...
- Raspberry Pi:树莓派安装基础系统 Raspberry Pi(树莓派系统)
准备材料 树莓派4B 树莓派系统镜像 SDFormatter (格式化工具) Win32DiskImager (镜像拷录工具) 镜像下载 Rspberry Pi (2020-08-24版本比较稳定) ...
- 其他:什么是元数据?(Metadata)?
元数据 任何文件系统中的数据分为数据和元数据.数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限.文件拥有者以及文件数据块的分布信息(inode...)等等 ...
- DB2某建表语句
DB2建表加注解的建表语句 CREATE TABLE table_name ( company CHARACTER(1) NOT NULL DEFAULT 'N', online CHARACTER( ...
- F5 Http monitor
The BIG-IP HTTP health monitor attempts to mabtch the configured Receive String against the HTTP res ...
- 华为交换机5855设置ssh
配置思路 配置交换机密钥对 #生成RSA密钥对 设置vty登陆用户界面的认证方式为AAA认证 #设置远程认证方式 设置aaa用户信息 #本地用户名和密码 #本地用户服务类型 #本地用户授权等级 设置s ...
- STP、生成树的算法
STP.生成树的算法 一.STP 1)STP概述 2)交换网络环路的产生 3)STP简介 4)STP的工作原理 5)S ...
- Python基础之魔术方法(控制属性的访问和设置)
# 魔术方法--常规方法# 1. __int__ 构造函数# 2. __new__ 在类实例之前就创建了# 3. __iter__ 迭代器# 4. __del__ 析构方法,用来清除释放的对象内存# ...