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(); } }