SaToken学习笔记-02

时间:2022-12-12 09:04:48

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的更多相关文章

  1. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  3. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  4. SaToken学习笔记-04

    SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...

  5. SaToken学习笔记-03

    SaToken学习笔记-03 如果排版有问题,请点击:传送门 核心思想 所谓权限验证,验证的核心就是一个账号是否拥有一个权限码 有,就让你通过.没有?那么禁止访问! 再往底了说,就是每个账号都会拥有一 ...

  6. SaToken学习笔记-01

    SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> &lt ...

  7. Redis:学习笔记-02

    Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...

  8. OGG学习笔记02

    实验环境:源端:192.168.1.30,Oracle 10.2.0.5 单实例目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1.模拟源数据库业务持续运行 2.配置OGG前 ...

  9. 《Master Bitcoin》学习笔记02——比特币的交易模型

    比特币的交易模型 模型基本描述 前面一篇学习笔记01提到了一个交易模型(第三章的内容),在第五章中,除了对这个模型做个详细介绍之外,其实和我上一篇理解的交易模型差不多,一个交易包含输入与输出,比特币是 ...

随机推荐

  1. Android笔记:去除标题栏

    1: 在oncreate方法中添加requestWindowFeature(Window.FEATURE_NO_TITLE); 必须在setContentView()之前执行. 2: 在Android ...

  2. QBC分页查询

    1.第一种方式 public class DetailDaoImpl extends HibernateTemplate implements DetailDaoInterface { private ...

  3. &lbrack;ZZ&rsqb;C&plus;&plus;中,引用和指针的区别

    (1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...

  4. C&plus;&plus;学习 &lpar;转&rpar;

    1.把C++当成一门新的语言学习: 2.看<Thinking In C++>: 3.看<The C++ Programming Language>和<Inside The ...

  5. Java基础--多线程的方方面面

    1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...

  6. webpack&plus;vue-cil 中proxyTable配置接口地址代理

    webpack+vue-cil 中proxyTable配置接口地址代理 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包 ...

  7. BZOJ 4820 &lbrack;SDOI2017&rsqb; 硬币游戏

    Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了.同学们觉得要加强趣味性,所以要找 ...

  8. TypeError&colon; &&num;39&semi;MongoClient&&num;39&semi; object is not callable

    在声明数据库的时候,将中括号[ ]换成了圆括号() 错误:

  9. Gson转换json数据为对象

    可以通过Gson使用两种方法,将json字符串转换为对象,以下面该段报文做测试 { "id": 84041462, "lastName": "小华&q ...

  10. 结合MapReduce和数据集Combining datasets with MapReduce

    While in the SQL-world is very easy combining two or more datasets - we just need to use the JOIN ke ...