提交关于超时登录的代码
parent
4740bbafe1
commit
b4f8168028
@ -0,0 +1,53 @@
|
||||
package com.supervision.config;
|
||||
|
||||
import cn.hutool.cache.CacheUtil;
|
||||
import cn.hutool.cache.impl.TimedCache;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.jwt.JWT;
|
||||
import com.supervision.exception.BusinessException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Slf4j
|
||||
public class UserSingleLoginConfig {
|
||||
|
||||
/**
|
||||
* 创建缓存,过期时间为5分钟,如果5分钟内没有请求过来,就认为是超时
|
||||
*/
|
||||
private static final TimedCache<Object, JWT> singleLoginTokenCacheMap = CacheUtil.newTimedCache(1000 * 5);
|
||||
|
||||
static {
|
||||
// 每秒钟扫描一次
|
||||
singleLoginTokenCacheMap.schedulePrune(1000);
|
||||
}
|
||||
|
||||
|
||||
public static void loginOrRefreshUser(String id, JWT jwt) {
|
||||
singleLoginTokenCacheMap.put(id, jwt);
|
||||
}
|
||||
|
||||
public static void checkSingleLogin(JWT currentJwt) {
|
||||
Object id = currentJwt.getPayload("id");
|
||||
JWT singleLoginTokenCache = singleLoginTokenCacheMap.get(id);
|
||||
if (ObjectUtil.isEmpty(singleLoginTokenCache)) {
|
||||
throw new BusinessException("用户已被踢下线或超时,请重新登录", 505);
|
||||
}
|
||||
// 然后将当前的expireTime和singleLoginTokenCache进行比较
|
||||
Object expireTime = singleLoginTokenCache.getPayload("expireTime");
|
||||
long singleLoginTokenCacheExpireTime = Long.parseLong(String.valueOf(expireTime));
|
||||
Object currentJwtExpireTimeObject = currentJwt.getPayload("expireTime");
|
||||
long currentJwtExpireTime = Long.parseLong(String.valueOf(currentJwtExpireTimeObject));
|
||||
if (singleLoginTokenCacheExpireTime == currentJwtExpireTime) {
|
||||
// 如果相等,说明这个token就是最新的,直接放行
|
||||
return;
|
||||
} else if (currentJwtExpireTime > singleLoginTokenCacheExpireTime) {
|
||||
// 如果当前的超时时间要大于缓存的,说明重新登录了,这个时候要把最新的放到缓存中
|
||||
singleLoginTokenCacheMap.put(id, currentJwt);
|
||||
} else {
|
||||
// 走到这里,说明singleLoginTokenCache是最新的,说明当前用户请求了一个新的token,那么原来的用户就踢掉
|
||||
throw new BusinessException("当前用户已在其他地方登录!", 505);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue