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提到了一个交易模型(第三章的内容),在第五章中,除了对这个模型做个详细介绍之外,其实和我上一篇理解的交易模型差不多,一个交易包含输入与输出,比特币是 ...
随机推荐
-
Android笔记:去除标题栏
1: 在oncreate方法中添加requestWindowFeature(Window.FEATURE_NO_TITLE); 必须在setContentView()之前执行. 2: 在Android ...
-
QBC分页查询
1.第一种方式 public class DetailDaoImpl extends HibernateTemplate implements DetailDaoInterface { private ...
-
[ZZ]C++中,引用和指针的区别
(1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...
-
C++学习 (转)
1.把C++当成一门新的语言学习: 2.看<Thinking In C++>: 3.看<The C++ Programming Language>和<Inside The ...
-
Java基础--多线程的方方面面
1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...
-
webpack+vue-cil 中proxyTable配置接口地址代理
webpack+vue-cil 中proxyTable配置接口地址代理 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包 ...
-
BZOJ 4820 [SDOI2017] 硬币游戏
Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了.同学们觉得要加强趣味性,所以要找 ...
-
TypeError: &#39;MongoClient&#39; object is not callable
在声明数据库的时候,将中括号[ ]换成了圆括号() 错误:
-
Gson转换json数据为对象
可以通过Gson使用两种方法,将json字符串转换为对象,以下面该段报文做测试 { "id": 84041462, "lastName": "小华&q ...
-
结合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 ...