记录一下写的小工具,里面的逻辑只能让各位大佬自己看了,各位用的时候自己改改 ,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;
}