Sa-Token获取当前所有可用Token

3 篇文章 1 订阅
2 篇文章 0 订阅

记录一下写的小工具,里面的逻辑只能让各位大佬自己看了,各位用的时候自己改改 ,TokenInfo这个类是自定义的,我这里是获取了一下当前token对应的用户最大的生命周期。各位大佬们自行享用了。

/**
     * 获取所有有效token集合
     * @return
     */
    public static LinkedHashMap<Integer, TokenInfo> getTokenGather() {
        //声明 存放token 信息map  k:用户登录ID  v:tokenInfo
        LinkedHashMap<Integer,TokenInfo> tokenTimeMap = new LinkedHashMap<>();
        //获取配置文件中Token的KeyName
        String tokenKeyName = SaManager.getConfig().getTokenName();
        //获取StpUserUtil中的成员变量LoginType
        String loginType = StpUserUtil.getLoginType();
        //获取SaTokenDao  Redis实现
        SaTokenDao saTokenDao = SaManager.getSaTokenDao();
        Integer start = -1;
        Integer size = 100;
        while(true){
            //获取 redis 中所有Token   keyword 关键字   start 开始处索引 (-1代表查询所有)  size 获取数量
            List<String> tokenList = StpUserUtil.searchTokenValue("", start, size);
            if(tokenList.isEmpty()){
                break;
            }
            start = size + 1;
            size = start + 100;
            for (String token : tokenList) {
                //拼接redisKey前缀
                String tokenRedisKey = StrUtil.format("{}:{}:token:",tokenKeyName,loginType);
                //切割结果集
                String[] split = token.split(tokenRedisKey);
                //获取token
                String tokenString = split[1];
                //根据token 获取登入用户ID
                Object loginIdObj = StpUserUtil.getLoginIdByToken(tokenString);
                Integer loginId = loginIdObj == null ? null : Integer.parseInt(loginIdObj.toString());
                // loginId 不正常 || loginId < 0, 表示当前token 以失效  跳过
                if(loginId == null || loginId < 0){
                    continue;
                }
                //获取当前token TTL 时间
                long timeout = saTokenDao.getTimeout(token);
                //获取当前token 登录端ID
                String deviceId = saTokenDao.get(tokenString);
                //获取登录端名称
                String device = SaTokenConf.DEVCIES[Integer.parseInt(deviceId)];
                //如果web 剩余tokenTime 大于一天  则给 web 赋值一天
                if(device.equals(SaTokenConf.DEVCIES[SaTokenConf.INT_WEB]) && timeout > 86400){
                    timeout = 86400;
                }
                //tokenTimeMap 获取用户ID 对应的Token 信息
                TokenInfo tokenInfo = tokenTimeMap.get(loginId);
                //比较 已存入的tokenTime  和  当前tokenTime   时间长短
                if(tokenInfo != null && tokenInfo.getTokenOutTime() > timeout){
                    //tokenInfo 不为空 并且  上一个token的剩余时间   大于当前token 的剩余时间  则用上一次token的信息
                    tokenTimeMap.put(loginId,new TokenInfo(loginId,device,tokenInfo.getTokenOutTime()));
                }else{
                    //tokenInfo为空  或者  上一次token 时间小于  当前token时间   则写入这一次token数据
                    tokenTimeMap.put(loginId,new TokenInfo(loginId,device,timeout));
                }
            }
        }
        return tokenTimeMap;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值