From 09d5667f71f75661534ff8112aa76eb9e52c7ed2 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Wed, 9 Jul 2025 01:53:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=A5=E5=BF=97=E6=89=93?= =?UTF-8?q?=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/filter/LoggingGlobalFilter.java | 146 ++++++++---------- 1 file changed, 61 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java index 7765494..975ce51 100644 --- a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java @@ -30,21 +30,68 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // 包装请求体 - RequestBodyLogExchange requestLogExchange = new RequestBodyLogExchange(exchange); - // 包装响应体 - ResponseBodyLogExchange responseLogExchange = new ResponseBodyLogExchange(exchange); + // 创建一个同时装饰 request 和 response 的 exchange + ServerWebExchange decoratedExchange = new ServerWebExchangeDecorator(exchange) { - return chain.filter(requestLogExchange) + private final StringBuilder requestBody = new StringBuilder(); + private final StringBuilder responseBody = new StringBuilder(); + + @Override + public ServerHttpRequest getRequest() { + return new ServerHttpRequestDecorator(super.getRequest()) { + @Override + public Flux getBody() { + return super.getBody().map(buffer -> { + byte[] bytes = new byte[buffer.readableByteCount()]; + buffer.read(bytes); + String chunk = new String(bytes, StandardCharsets.UTF_8); + requestBody.append(chunk); + DataBufferUtils.release(buffer); + return buffer.factory().wrap(bytes); + }); + } + }; + } + + @Override + public ServerHttpResponse getResponse() { + return new ServerHttpResponseDecorator(super.getResponse()) { + @Override + public Mono writeWith(Publisher body) { + if (body instanceof Flux) { + Flux fluxBody = (Flux) body; + return super.writeWith(fluxBody.map(buffer -> { + byte[] content = new byte[buffer.readableByteCount()]; + buffer.read(content); + DataBufferUtils.release(buffer); + + String responseStr = new String(content, StandardCharsets.UTF_8); + responseBody.append(responseStr); + + return buffer.factory().wrap(content); + })); + } + return super.writeWith(body); + } + }; + } + + public String getRequestBody() { + return requestBody.toString(); + } + + public String getResponseBody() { + return responseBody.toString(); + } + }; + + return chain.filter(decoratedExchange) .then(Mono.fromRunnable(() -> { - String requestBody = requestLogExchange.getRequestBody(); - String responseBody = responseLogExchange.getResponseBody(); - log.info("🌐 请求路径: {}", exchange.getRequest().getPath()); log.info("📥 请求头: {}", exchange.getRequest().getHeaders()); - log.info("📥 请求体: {}", requestBody); + log.info("📥 请求体: {}", ((CustomExchange) decoratedExchange).getRequestBody()); log.info("🔚 响应状态: {}", exchange.getResponse().getStatusCode()); - log.info("📤 响应内容: {}", responseBody); + log.info("📤 响应内容: {}", ((CustomExchange) decoratedExchange).getResponseBody()); })); } @@ -53,80 +100,9 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { return Ordered.LOWEST_PRECEDENCE; // 最后执行 } - /** - * 请求体拦截装饰器 - */ - static class RequestBodyLogExchange extends ServerWebExchangeDecorator { - - private final StringBuilder requestBody = new StringBuilder(); - - public RequestBodyLogExchange(ServerWebExchange delegate) { - super(delegate); - } - - @Override - public ServerHttpRequest getRequest() { - return new ServerHttpRequestDecorator(super.getRequest()) { - @Override - public Flux getBody() { - return super.getBody().map(buffer -> { - byte[] bytes = new byte[buffer.readableByteCount()]; - buffer.read(bytes); - String chunk = new String(bytes, StandardCharsets.UTF_8); - requestBody.append(chunk); - DataBufferUtils.release(buffer); // 释放原始 buffer - return buffer.factory().wrap(bytes); // 返回新的 buffer - }); - } - }; - } - - public String getRequestBody() { - return requestBody.toString(); - } - } - - /** - * 响应体拦截装饰器(适配 Spring Boot 2.3.x) - */ - static class ResponseBodyLogExchange extends ServerWebExchangeDecorator { - - private final StringBuilder responseBody = new StringBuilder(); - private final ServerWebExchange exchange; // 显式保存 exchange 引用 - - public ResponseBodyLogExchange(ServerWebExchange delegate) { - super(delegate); - this.exchange = delegate; - } - - @Override - public ServerHttpResponse getResponse() { - return new ServerHttpResponseDecorator(super.getResponse()) { - @Override - public Mono writeWith(Publisher body) { - if (body instanceof Flux) { - Flux fluxBody = (Flux) body; - return super.writeWith(fluxBody.map(buffer -> { - byte[] content = new byte[buffer.readableByteCount()]; - buffer.read(content); - DataBufferUtils.release(buffer); // 释放原始 buffer - - String responseStr = new String(content, StandardCharsets.UTF_8); - responseBody.append(responseStr); - - // ✅ 使用外部传入的 exchange 来设置 attribute - exchange.getAttributes().put("responseBody", responseStr); - - return buffer.factory().wrap(content); // 返回新 buffer - })); - } - return super.writeWith(body); - } - }; - } - - public String getResponseBody() { - return responseBody.toString(); - } + // 自定义接口用于获取 body 内容 + private interface CustomExchange extends ServerWebExchange { + String getRequestBody(); + String getResponseBody(); } } \ No newline at end of file