记录解决satoken每次登录都会再redis创建新的token(非token共用)

整个链路比较复杂,我只 针对遇到的问题,给出解决思路

场景:

在整合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的统一管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值