1. 定义临时类
public class LoginTempInfo {
private String token;
private String device;
private Long remainingTime;
private LoginTempInfo(){}
public LoginTempInfo(String token, String device, Long remainingTime) {
this.token = token;
this.device = device;
this.remainingTime = remainingTime;
}
public String getToken() {
return this.token;
}
public String getDevice() {
return this.device;
}
public Long getRemainingTime() {
return this.remainingTime;
}
@Override
public String toString() {
return "LoginTempInfo{" +
"token='" + token + '\'' +
", device='" + device + '\'' +
", remainingTime=" + remainingTime +
'}';
}
}
2. 定义工具类
public class SaUserInfoPlugin {
// 获取当前环境下所有已经登录的用户相关信息(不包括过期token信息)
public static Map<String, List<LoginTempInfo>> getAllUserMap(String loginType) {
// 获取 StpUtil 登录体系下的实际逻辑对象(单独把 StpLogic 提取出来是为了方便后期修改 StpUtil 的名字
StpLogic stpLogic = SaManager.getStpLogic(loginType);
// 获取所有 token ,如果数量庞大可以分页
List<String> tokens = stpLogic.searchTokenValue("", -1, -1, true);
// 保存所有用户id及对应的不同平台下的临时有效时长
Map<String, List<LoginTempInfo>> idTokensMap = new HashMap<>();
for (String sourceToken: tokens) {
// 截取真实 token 值
String token = sourceToken.substring(sourceToken.lastIndexOf(":")+1);
// 获取临时有效期
long activityTimeout = stpLogic.getTokenActivityTimeoutByToken(token);
if (activityTimeout == -2) {
// 当前 token 所代表的会话已经临时过期了, 直接跳过
continue;
}
// 尝试根据 token 获取 loginId
Object loginIdByToken = stpLogic.getLoginIdByToken(token);
if (loginIdByToken != null) {
// 转换为原始类型, 这里根据登录时的参数类型动态修改
String loginId = loginIdByToken.toString();
// 根据登录id和token, 获取对应的登录类型
String loginDevice = null;
SaSession session = stpLogic.getSessionByLoginId(loginId, false);
if(session == null) {
loginDevice = "";
} else {
// 遍历解析
List<TokenSign> tokenSignList = session.tokenSignListCopy();
for (TokenSign tokenSign : tokenSignList) {
if(tokenSign.getValue().equals(token)) {
loginDevice = tokenSign.getDevice();
break;
}
}
}
// 每个用户id可以多次登录, 也可以在不同平台登录
LoginTempInfo tempInfo = new LoginTempInfo(token, loginDevice, activityTimeout);
// 同一个用户如果多端登录需要同时记录不同平台的时限
if (idTokensMap.containsKey(loginId)) {
// 如果有这个 loginId 直接获取并添加
idTokensMap.get(loginId).add(tempInfo);
} else {
// 如果没有则新建并绑定 loginId
List<LoginTempInfo> infoArr = new ArrayList<>();
infoArr.add(tempInfo);
idTokensMap.put(loginId, infoArr);
}
}
}
return idTokensMap;
}
// 获取当前环境下指定用户所有相关信息(包括过期token信息)
public static Map<String, List<LoginTempInfo>> getOneUserMap(String loginType, Object loginIdObj) {
// 获取 StpUtil 登录体系下的实际逻辑对象(单独把 StpLogic 提取出来是为了方便后期修改 StpUtil 的名字
StpLogic stpLogic = SaManager.getStpLogic(loginType);
List<String> tokens = stpLogic.getTokenValueListByLoginId(loginIdObj);
Map<String, List<LoginTempInfo>> idTokensMap = new HashMap<>();
for (String sourceToken: tokens) {
// 截取真实 token 值
String token = sourceToken.substring(sourceToken.lastIndexOf(":")+1);
// 获取临时有效期
long activityTimeout = stpLogic.getTokenActivityTimeoutByToken(token);
if (loginIdObj != null) {
// 转换为原始类型, 这里根据登录时的参数类型动态修改
String loginId = loginIdObj.toString();
// 根据登录id和token, 获取对应的登录类型
String loginDevice = null;
SaSession session = stpLogic.getSessionByLoginId(loginId, false);
if(session == null) {
loginDevice = "";
} else {
// 遍历解析
List<TokenSign> tokenSignList = session.tokenSignListCopy();
for (TokenSign tokenSign : tokenSignList) {
if(tokenSign.getValue().equals(token)) {
loginDevice = tokenSign.getDevice();
break;
}
}
}
// 每个用户id可以多次登录, 也可以在不同平台登录
LoginTempInfo tempInfo = new LoginTempInfo(token, loginDevice, activityTimeout);
// 同一个用户如果多端登录需要同时记录不同平台的时限
if (idTokensMap.containsKey(loginId)) {
// 如果有这个 loginId 直接获取并添加
idTokensMap.get(loginId).add(tempInfo);
} else {
// 如果没有则新建并绑定 loginId
List<LoginTempInfo> infoArr = new ArrayList<>();
infoArr.add(tempInfo);
idTokensMap.put(loginId, infoArr);
}
}
}
return idTokensMap;
}
}
3. 直接使用
Map<String, List<LoginTempInfo>> all = SaUserInfoPlugin.getAllUserMap(StpUtil.getLoginType());
Map<String, List<LoginTempInfo>> one = SaUserInfoPlugin.getOneUserMap(StpUtil.getLoginType(), loginId);