public void logoutHttpServletRequest request String token = requestgetHeadertoken;如何让token的时间失效不使用Redis与数据库存储
可以使用Java自带的定时器Timer和TimerTask来实现token的定时失效。
-
在用户登录成功时,生成一个token,并将token和用户信息存储在一个Map中,同时记录下生成token的时间戳。
-
每次用户访问需要验证token的接口时,先从Map中获取token对应的用户信息,并检查当前时间戳和生成token的时间戳的差值是否超过了一定时间(比如30分钟)。
-
当用户调用logout方法时,从Map中移除对应的token和用户信息。
-
定时器Timer和TimerTask用来定期清理过期的token,比如每小时清理一次。在TimerTask中遍历Map,将过期的token和对应的用户信息移除。
示例代码如下:
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
public class TokenManager {
// 存储token和对应的用户信息
private static Map<String, Object> tokenMap = new HashMap<>();
// token有效时间,单位为毫秒
private static final long TOKEN_EXPIRE_TIME = 30 * 60 * 1000; // 30分钟
// 清理过期token的定时器
private static Timer timer = new Timer();
/**
* 生成一个新的token,并将token和用户信息存储在Map中
*/
public static String generateToken(Object userInfo) {
String token = UUID.randomUUID().toString();
tokenMap.put(token, userInfo);
return token;
}
/**
* 验证token是否有效,并返回对应的用户信息
*/
public static Object validateToken(String token) {
Object userInfo = tokenMap.get(token);
if (userInfo != null) {
// 获取token生成的时间戳
long timestamp = (Long) tokenMap.get(token + "_timestamp");
// 检查当前时间戳和生成token的时间戳的差值是否超过TOKEN_EXPIRE_TIME
if (System.currentTimeMillis() - timestamp <= TOKEN_EXPIRE_TIME) {
// 更新token的时间戳
tokenMap.put(token + "_timestamp", System.currentTimeMillis());
return userInfo;
} else {
// token过期,移除token和对应的用户信息
tokenMap.remove(token);
tokenMap.remove(token + "_timestamp");
}
}
return null;
}
/**
* 移除指定的token和对应的用户信息
*/
public static void removeToken(String token) {
tokenMap.remove(token);
tokenMap.remove(token + "_timestamp");
}
/**
* 定时清理过期的token
*/
static {
timer.schedule(new TimerTask() {
@Override
public void run() {
for (String token : tokenMap.keySet()) {
if (token.endsWith("_timestamp")) {
continue; // 跳过时间戳记录
}
Object userInfo = validateToken(token);
if (userInfo == null) {
tokenMap.remove(token); // 移除过期的token和对应的用户信息
}
}
}
}, 0, 60 * 60 * 1000); // 每小时清理一次
}
}
``
原文地址: https://www.cveoy.top/t/topic/eRcn 著作权归作者所有。请勿转载和采集!