可以使用Java自带的定时器Timer和TimerTask来实现token的定时失效。

  1. 在用户登录成功时,生成一个token,并将token和用户信息存储在一个Map中,同时记录下生成token的时间戳。

  2. 每次用户访问需要验证token的接口时,先从Map中获取token对应的用户信息,并检查当前时间戳和生成token的时间戳的差值是否超过了一定时间(比如30分钟)。

  3. 当用户调用logout方法时,从Map中移除对应的token和用户信息。

  4. 定时器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); // 每小时清理一次
    }
}
``
public void logoutHttpServletRequest request String token = requestgetHeadertoken;如何让token的时间失效不使用Redis与数据库存储

原文地址: https://www.cveoy.top/t/topic/eRcn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录