package com.cl.service.impl; import com.cl.util.JwtUtil; import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.Date; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @Service @Slf4j public class TokenBlacklistService { // 使用ConcurrentHashMap或Redis存储黑名单 private final Set blacklist = Collections.newSetFromMap(new ConcurrentHashMap<>()); public void addToBlacklist(String token) { blacklist.add(token); } public boolean isBlacklisted(String token) { return blacklist.contains(token); } /** * 定时清理过期令牌(每2小时执行一次) */ @Scheduled(fixedRate = 2, timeUnit = TimeUnit.HOURS) public void cleanupExpiredTokens() { log.info("开始清理过期token"); blacklist.removeIf(this::isTokenExpired); } /** * 检查JWT Token是否过期 * @param token JWT Token字符串 * @return true-已过期,false-未过期 */ public boolean isTokenExpired(String token) { try { Claims claims = JwtUtil.parseJWT(token); return claims.getExpiration().before(new Date()); } catch (Exception e) { // 如果解析过程中出现异常(如Token无效、已过期等),视为已过期 return true; } } }