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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值