sa-Token的JWT验证问题
写项目的时候,发现自己的项目在后端服务重启后,登入状态会失效,一查配置发现sa-Token用的默认是UUID作为token,于是便着手修改为JWT。众所周知,JWT会记录信息,包括你是谁、你有什么权限、什么时候过期,理所当然的,我就认为换成JWT后,登入状态失效的问题就能得到解决。
在更换为JWT的过程中,我遇到了两个问题:
其一,是在application.yml里配置token-style为jwt后,前端收到的token依旧是UUID的问题。
这个是因为我为了实现权限管理,实现了StpInterface
这个接口,这就导致“约定大于配置”被打破了,所以,我还需要通过注入 StpLogic 对象,告知 Sa-Token 在 StpUtil 中要使用的 StpLogic 的具体实现类
其二,是登入状态依旧没有被保存的问题。
这个我思来想去都没能搞懂,最后,在Gemini大人的帮助下,我才知道这是sa-Token实现的问题:三次检查。
第一次,是根据密钥,用相同的算法,对head和payload进行运算,然后对JWT自带的那个值进行比较。
第二次,是检查有效期。
前两次都很正规,最头疼的就算这个第三次检查:Sa-Token的核心会话状态。
sa-Token为了实现“把人踢下线”这个功能,会从JWT里读取loginId,去内存里查有没有这个id,正是这个步骤,导致我之前所作的将UUID替换为JWT的工作都白费了。