diff --git a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java index 975ce51..b019a85 100644 --- a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java @@ -27,71 +27,18 @@ import java.nio.charset.StandardCharsets; @Slf4j @Component public class LoggingGlobalFilter implements GlobalFilter, Ordered { - @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // 创建一个同时装饰 request 和 response 的 exchange - ServerWebExchange decoratedExchange = new ServerWebExchangeDecorator(exchange) { - - 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(); - } - }; + // 创建自定义 exchange 装饰器 + CustomExchange decoratedExchange = new CustomExchange(exchange); return chain.filter(decoratedExchange) .then(Mono.fromRunnable(() -> { log.info("🌐 请求路径: {}", exchange.getRequest().getPath()); log.info("📥 请求头: {}", exchange.getRequest().getHeaders()); - log.info("📥 请求体: {}", ((CustomExchange) decoratedExchange).getRequestBody()); + log.info("📥 请求体: {}", decoratedExchange.getRequestBody()); log.info("🔚 响应状态: {}", exchange.getResponse().getStatusCode()); - log.info("📤 响应内容: {}", ((CustomExchange) decoratedExchange).getResponseBody()); + log.info("📤 响应内容: {}", decoratedExchange.getResponseBody()); })); } @@ -100,8 +47,73 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { return Ordered.LOWEST_PRECEDENCE; // 最后执行 } - // 自定义接口用于获取 body 内容 - private interface CustomExchange extends ServerWebExchange { + /** + * 自定义装饰器,实现 ServerWebExchange 并扩展 body 记录功能 + */ + private static class CustomExchange extends ServerWebExchangeDecorator implements CustomExchangeInterface { + + private final StringBuilder requestBody = new StringBuilder(); + private final StringBuilder responseBody = new StringBuilder(); + + public CustomExchange(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); + 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); + } + }; + } + + @Override + public String getRequestBody() { + return requestBody.toString(); + } + + @Override + public String getResponseBody() { + return responseBody.toString(); + } + } + + /** + * 扩展接口,提供获取 body 的方法 + */ + private interface CustomExchangeInterface extends ServerWebExchange { String getRequestBody(); String getResponseBody(); }