整个链路比较复杂,我只 针对遇到的问题,给出解决思路
场景:
在整合satoken(已完成redis整合)的时候,项目会用到的场景:
1:用户登录
2:三方通过api接口调用
统一token生成规则后,每一次登录或者三方调用都会生成新的token,导致redis大量相同账号的token信息,我也试过使用satoken的配置is-share,正常的业务场景下,给到的token会有有效期,这种就很难体现,之后思考后给出的方案是统一登录接口做用户是否登录判断
//判断用户是否已经登录,避免重复生成token信息
SaSession saSession = StpUtil.getSessionByLoginId(loginUser.getLoginId());
if (Objects.nonNull(saSession) && CollectionUtil.isNotEmpty(saSession.getTokenSignList())) {
String token = saSession.getTokenSignList().get(0).getValue();
long tokenTimeout = StpUtil.getTokenTimeout(token);
if (tokenTimeout > MIN_TOKEN_TIMEOUT || tokenTimeout == -1) {
return TokenVo.buildToken(token, tokenTimeout);
}
}
//没有重新生成token信息
return doLogin(loginUser, deviceType);
redis存在就返回已经存在的token和有效时间,然而在设置有效时间的时候,正常设置有效期没有任何问题,我在希望超管的有效期为永久的时候,出现redis中同一账户的的数据出现不同token,在跟踪satoken源码的时候,如图:

我设置了timeout为-1,可是每次执行到上述代码,redis中数据就会被莫名删除,导致无法获取token,从而产生重复数据,跟踪源码可以知晓,最终会交由你自行扩展的SaTokenDao来执行操作,这个地方-1是有歧义的,在整合redis时,当设置时间为-1 会清楚redis数据,因此扩展类需要对timeout为-1做特殊处理(清楚有效期而非清除数据)至此完成token的统一管理。
1966

被折叠的 条评论
为什么被折叠?



