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<String> 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;
|
}
|
}
|
}
|