| | |
| | | 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<>()); |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |