From 5d7b65670282a4fad015e37d567cfa171b162052 Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期二, 20 五月 2025 12:25:19 +0800 Subject: [PATCH] 基础代码 --- pt-errand/src/main/java/com/ruoyi/errand/utils/TokenBlacklistService.java | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 93 insertions(+), 0 deletions(-) diff --git a/pt-errand/src/main/java/com/ruoyi/errand/utils/TokenBlacklistService.java b/pt-errand/src/main/java/com/ruoyi/errand/utils/TokenBlacklistService.java new file mode 100644 index 0000000..33fda55 --- /dev/null +++ b/pt-errand/src/main/java/com/ruoyi/errand/utils/TokenBlacklistService.java @@ -0,0 +1,93 @@ +package com.ruoyi.errand.utils; + + + +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.Date; + +import java.util.concurrent.TimeUnit; + + +@Service +@Slf4j +public class TokenBlacklistService { + private final RedisTemplate redisTemplate; + + // 使用构造器注入替代字段注入 + @Autowired + public TokenBlacklistService(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + // 黑名单键前缀 + private static final String BLACKLIST_KEY_PREFIX = "token:blacklist:"; + + // 过期时间缓冲(防止刚好过期时还在黑名单中) + private static final long EXPIRATION_BUFFER_MS = 30000; // 30秒 + + /** + * 添加Token到黑名单 + * @param token JWT Token + */ + public void addToBlacklist(String token) { + try { + String realToken=token.substring(4); + Claims claims = JwtUtil.parseJWT(realToken); + Date expiration = claims.getExpiration(); + long ttl = expiration.getTime() - System.currentTimeMillis() + EXPIRATION_BUFFER_MS; + + if (ttl > 0) { + redisTemplate.opsForValue().set( + BLACKLIST_KEY_PREFIX + realToken, + "1", + ttl, + TimeUnit.MILLISECONDS + ); + log.info("Token已加入黑名单,剩余有效期: {} 毫秒", ttl); + } + } catch (Exception e) { + log.error("添加Token到黑名单失败", e); + } + } + + /** + * 检查Token是否在黑名单中 + * @param token JWT Token + * @return true-在黑名单中,false-不在黑名单中 + */ + public boolean isBlacklisted(String token) { + Boolean exists = redisTemplate.hasKey(BLACKLIST_KEY_PREFIX + token); + return exists != null && exists; + } + + /** + * 清理过期Token(Redis会自动过期,此方法可选保留) + */ + @Scheduled(fixedRate = 2, timeUnit = TimeUnit.HOURS) + public void cleanupExpiredTokens() { + log.info("Token黑名单清理任务开始执行"); + // Redis有自动过期机制,此方法主要做日志记录 + log.info("Token黑名单清理任务完成(Redis自动处理过期)"); + } + + /** + * 检查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; + } + } +} \ No newline at end of file -- Gitblit v1.7.1