From bb92857db9502fcfbdc1fbe8b3442cc284d1b869 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Mon, 8 Sep 2025 17:29:32 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E7=BD=91=E5=85=B3=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/filter/LoggingGlobalFilter.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java index 6130b79..fdebebf 100644 --- a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java @@ -20,6 +20,7 @@ import org.springframework.web.server.ServerWebExchangeDecorator; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.UUID; @@ -64,7 +65,8 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { private static class CustomExchange extends ServerWebExchangeDecorator implements CustomExchangeInterface { private final StringBuilder requestBody = new StringBuilder(); - private String responseBody; + private final StringBuilder responseBodyBuilder = new StringBuilder(); + public CustomExchange(ServerWebExchange delegate) { @@ -88,25 +90,24 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { }; } + @Override public ServerHttpResponse getResponse() { - return new ServerHttpResponseDecorator(super.getResponse()) { - private final StringBuilder responseBodyBuilder = new StringBuilder(); + ServerHttpResponse originalResponse = super.getResponse(); + DataBufferFactory bufferFactory = originalResponse.bufferFactory(); + return new ServerHttpResponseDecorator(originalResponse) { @Override public Mono writeWith(Publisher body) { if (body instanceof Flux) { - return super.writeWith(Flux.from(body) - .doOnNext(buffer -> { - DataBufferUtils.join(Flux.just(buffer)) - .map(dataBuffer -> { - byte[] content = new byte[dataBuffer.readableByteCount()]; - dataBuffer.read(content); - responseBody = new String(content, StandardCharsets.UTF_8); - return dataBuffer; - }) - .subscribe(); - })); + Flux flux = (Flux) body; + return super.writeWith(flux.doOnNext(dataBuffer -> { + byte[] bytes = new byte[dataBuffer.readableByteCount()]; + dataBuffer.read(bytes); + String bodyContent = new String(bytes, StandardCharsets.UTF_8); + responseBodyBuilder.append(bodyContent); + DataBufferUtils.release(dataBuffer); + }).map(bytes -> bufferFactory.wrap((ByteBuffer) bytes))); } return super.writeWith(body); } @@ -120,7 +121,7 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { @Override public String getResponseBody() { - return responseBody; + return responseBodyBuilder.toString(); } } From 8b5648a3dc1203b5695a7c6654a96ff974446df4 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Mon, 8 Sep 2025 17:43:14 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sczx/gateway/filter/LoggingGlobalFilter.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java index fdebebf..617d42e 100644 --- a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java @@ -94,7 +94,7 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { @Override public ServerHttpResponse getResponse() { ServerHttpResponse originalResponse = super.getResponse(); - DataBufferFactory bufferFactory = originalResponse.bufferFactory(); +// DataBufferFactory bufferFactory = originalResponse.bufferFactory(); return new ServerHttpResponseDecorator(originalResponse) { @Override @@ -102,12 +102,15 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { if (body instanceof Flux) { Flux flux = (Flux) body; return super.writeWith(flux.doOnNext(dataBuffer -> { + // 读取数据内容用于日志记录 byte[] bytes = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); String bodyContent = new String(bytes, StandardCharsets.UTF_8); responseBodyBuilder.append(bodyContent); - DataBufferUtils.release(dataBuffer); - }).map(bytes -> bufferFactory.wrap((ByteBuffer) bytes))); + + // 重置读取位置,以便后续处理可以正常读取 + dataBuffer.readPosition(0); + })); } return super.writeWith(body); } From 35b3cbfdc0ee4eb0bf99c3b8c0800c44d4dbdc7f Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Mon, 8 Sep 2025 17:47:28 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=86=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sczx/gateway/filter/LoggingGlobalFilter.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java index 617d42e..988fd10 100644 --- a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java @@ -94,7 +94,7 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { @Override public ServerHttpResponse getResponse() { ServerHttpResponse originalResponse = super.getResponse(); -// DataBufferFactory bufferFactory = originalResponse.bufferFactory(); + DataBufferFactory bufferFactory = originalResponse.bufferFactory(); return new ServerHttpResponseDecorator(originalResponse) { @Override @@ -102,14 +102,18 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered { if (body instanceof Flux) { Flux flux = (Flux) body; return super.writeWith(flux.doOnNext(dataBuffer -> { + // 复制数据以避免修改原始缓冲区 + DataBuffer duplicate = dataBuffer.factory().allocateBuffer(dataBuffer.readableByteCount()); + duplicate.write(dataBuffer); + // 读取数据内容用于日志记录 - byte[] bytes = new byte[dataBuffer.readableByteCount()]; - dataBuffer.read(bytes); + byte[] bytes = new byte[duplicate.readableByteCount()]; + duplicate.read(bytes); String bodyContent = new String(bytes, StandardCharsets.UTF_8); responseBodyBuilder.append(bodyContent); - // 重置读取位置,以便后续处理可以正常读取 - dataBuffer.readPosition(0); + // 释放复制的缓冲区 + DataBufferUtils.release(duplicate); })); } return super.writeWith(body); From 884967423f4ad8222977fbda38b5c432e958e449 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Mon, 8 Sep 2025 18:10:01 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/filter/LoggingGlobalFilter.java | 2 +- .../filter/RequestLogGlobalFilter.java | 2 +- .../filter/ResponseLogGlobalFilter.java | 54 ++++++++++++------- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java index 988fd10..8ddcb2c 100644 --- a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java @@ -29,7 +29,7 @@ import java.util.UUID; * 适用于 Spring Boot 2.3.x + Spring Cloud Hoxton.SR12 环境。 */ @Slf4j -@Component +//@Component public class LoggingGlobalFilter implements GlobalFilter, Ordered { @Override diff --git a/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java index 174a308..34efd69 100644 --- a/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java @@ -22,7 +22,7 @@ import java.util.LinkedHashSet; import java.util.regex.Matcher; import java.util.regex.Pattern; -//@Configuration +@Configuration @Slf4j public class RequestLogGlobalFilter implements GlobalFilter, Ordered { diff --git a/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java index 4065c69..1a44e2b 100644 --- a/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java @@ -23,45 +23,54 @@ import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @Slf4j -//@Configuration +@Configuration public class ResponseLogGlobalFilter implements GlobalFilter, Ordered { + @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { try { ServerHttpResponse originalResponse = exchange.getResponse(); DataBufferFactory bufferFactory = originalResponse.bufferFactory(); HttpStatus statusCode = originalResponse.getStatusCode(); + + // 排除特定路径,避免处理Swagger等静态资源 + String path = exchange.getRequest().getURI().getPath(); + if (path.contains("/v2/api-docs") || + path.contains("/swagger") || + path.contains("/webjars")) { + return chain.filter(exchange); + } + if (statusCode != HttpStatus.OK) { return chain.filter(exchange);//降级处理返回数据 } + ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) { @Override public Mono writeWith(Publisher body) { if (body instanceof Flux) { Flux fluxBody = Flux.from(body); - return super.writeWith(fluxBody.buffer().map(dataBuffers -> { + return super.writeWith(fluxBody.map(dataBuffer -> { + // 复制数据以避免修改原始缓冲区 + byte[] content = new byte[dataBuffer.readableByteCount()]; + dataBuffer.read(content); + DataBufferUtils.release(dataBuffer); - // 合并多个流集合,解决返回体分段传输 - DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); - DataBuffer buff = dataBufferFactory.join(dataBuffers); - byte[] content = new byte[buff.readableByteCount()]; - buff.read(content); - DataBufferUtils.release(buff);//释放掉内存 - - //排除Excel导出,不是application/json不打印。若请求是上传图片则在最上面判断。 + // 排除Excel导出,不是application/json不打印。若请求是上传图片则在最上面判断。 MediaType contentType = originalResponse.getHeaders().getContentType(); - if (!MediaType.APPLICATION_JSON.isCompatibleWith(contentType)) { + if (contentType == null || !MediaType.APPLICATION_JSON.isCompatibleWith(contentType)) { return bufferFactory.wrap(content); } // 构建返回日志 - String joinData = new String(content); + String joinData = new String(content, StandardCharsets.UTF_8); String result = modifyBody(joinData); List rspArgs = new ArrayList<>(); rspArgs.add(originalResponse.getStatusCode().value()); @@ -69,8 +78,8 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered { rspArgs.add(result); log.info("<-- {} {}\n{}", rspArgs.toArray()); - getDelegate().getHeaders().setContentLength(result.getBytes().length); - return bufferFactory.wrap(result.getBytes()); + // 返回处理后的内容 + return bufferFactory.wrap(result.getBytes(StandardCharsets.UTF_8)); })); } else { log.error("<-- {} 响应code异常", getStatusCode()); @@ -88,14 +97,23 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered { @Override public int getOrder() { - return Ordered.HIGHEST_PRECEDENCE; + // 设置较低优先级,确保在其他过滤器之后执行 + return Ordered.LOWEST_PRECEDENCE - 1; } //返回统一的JSON日期数据 2024-02-23 11:00, null转空字符串 private String modifyBody(String jsonStr){ - JSONObject json = JSON.parseObject(jsonStr, Feature.AllowISO8601DateFormat); - JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm"; - return JSONObject.toJSONString(json, (ValueFilter) (object, name, value) -> value == null ? "" : value, SerializerFeature.WriteDateUseDateFormat); + if (jsonStr == null || jsonStr.isEmpty()) { + return jsonStr; + } + try { + JSONObject json = JSON.parseObject(jsonStr, Feature.AllowISO8601DateFormat); + JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm"; + return JSONObject.toJSONString(json, (ValueFilter) (object, name, value) -> value == null ? "" : value, SerializerFeature.WriteDateUseDateFormat); + } catch (Exception e) { + // 如果不是有效的JSON,直接返回原始字符串 + return jsonStr; + } } } From 094044ed737b8b20ab77f97bfe4846fc2df10b04 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Mon, 8 Sep 2025 18:18:05 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=9B=9E=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java | 2 +- .../java/com/sczx/gateway/filter/RequestLogGlobalFilter.java | 2 +- .../java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java index 8ddcb2c..988fd10 100644 --- a/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/LoggingGlobalFilter.java @@ -29,7 +29,7 @@ import java.util.UUID; * 适用于 Spring Boot 2.3.x + Spring Cloud Hoxton.SR12 环境。 */ @Slf4j -//@Component +@Component public class LoggingGlobalFilter implements GlobalFilter, Ordered { @Override diff --git a/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java index 34efd69..174a308 100644 --- a/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/RequestLogGlobalFilter.java @@ -22,7 +22,7 @@ import java.util.LinkedHashSet; import java.util.regex.Matcher; import java.util.regex.Pattern; -@Configuration +//@Configuration @Slf4j public class RequestLogGlobalFilter implements GlobalFilter, Ordered { diff --git a/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java b/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java index 1a44e2b..44e2f27 100644 --- a/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java +++ b/src/main/java/com/sczx/gateway/filter/ResponseLogGlobalFilter.java @@ -28,7 +28,7 @@ import java.util.ArrayList; import java.util.List; @Slf4j -@Configuration +//@Configuration public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {