From 5a1244ddd68bac2450d7df52ddfd22bd05a3019c Mon Sep 17 00:00:00 2001 From: litianxiang Date: Fri, 29 May 2026 16:02:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=BB=91=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E6=B8=85=E9=99=A4=E5=A4=B1=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/LogoutBlacklistWebFilter.java | 43 ++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/aida/gateway/filter/LogoutBlacklistWebFilter.java b/src/main/java/com/aida/gateway/filter/LogoutBlacklistWebFilter.java index e2519bb..b60f327 100644 --- a/src/main/java/com/aida/gateway/filter/LogoutBlacklistWebFilter.java +++ b/src/main/java/com/aida/gateway/filter/LogoutBlacklistWebFilter.java @@ -32,16 +32,25 @@ public class LogoutBlacklistWebFilter implements WebFilter { @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { - // 仅处理 /internal/logout 路径 - if (!exchange.getRequest().getURI().getPath().equals("/internal/logout")) { - return chain.filter(exchange); + String path = exchange.getRequest().getURI().getPath(); + + // /internal/logout → 拉黑用户 + // /internal/clear-blacklist → 清除黑名单 + if ("/internal/logout".equals(path)) { + return handleLogout(exchange, chain); + } + if ("/internal/clear-blacklist".equals(path)) { + return handleClearBlacklist(exchange, chain); } + return chain.filter(exchange); + } + + private Mono handleLogout(ServerWebExchange exchange, WebFilterChain chain) { if (!"POST".equalsIgnoreCase(exchange.getRequest().getMethod().name())) { return chain.filter(exchange); } - // 优先从请求头读取 X-User-Id,其次从 query param 读取 userId(兼容不同客户端调用方式) String userId = exchange.getRequest().getHeaders().getFirst(AuthConstants.USER_ID_HEADER); if (userId == null || userId.isBlank()) { userId = exchange.getRequest().getQueryParams().getFirst("userId"); @@ -51,8 +60,6 @@ public class LogoutBlacklistWebFilter implements WebFilter { } String blacklistKey = AuthConstants.BLACKLIST_PREFIX + userId; - - // 黑名单 TTL 设为 7 天(与 JWT 有效期保持一致) String finalUserId = userId; return redisTemplate.opsForValue() .set(blacklistKey, "1") @@ -65,6 +72,30 @@ public class LogoutBlacklistWebFilter implements WebFilter { }); } + private Mono handleClearBlacklist(ServerWebExchange exchange, WebFilterChain chain) { + if (!"POST".equalsIgnoreCase(exchange.getRequest().getMethod().name())) { + return chain.filter(exchange); + } + + String userId = exchange.getRequest().getHeaders().getFirst(AuthConstants.USER_ID_HEADER); + if (userId == null || userId.isBlank()) { + userId = exchange.getRequest().getQueryParams().getFirst("userId"); + } + if (userId == null || userId.isBlank()) { + return writeResponse(exchange, HttpStatus.BAD_REQUEST, "{\"code\":400,\"message\":\"userId required\"}"); + } + + String blacklistKey = AuthConstants.BLACKLIST_PREFIX + userId; + String finalUserId = userId; + return redisTemplate.delete(blacklistKey) + .then(writeResponse(exchange, HttpStatus.OK, "{\"code\":200,\"message\":\"ok\"}")) + .onErrorResume(e -> { + log.error("Failed to clear blacklist, userId={}", finalUserId, e); + return writeResponse(exchange, HttpStatus.INTERNAL_SERVER_ERROR, + "{\"code\":500,\"message\":\"internal error\"}"); + }); + } + private Mono writeResponse(ServerWebExchange exchange, HttpStatus status, String body) { exchange.getResponse().setStatusCode(status); exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);