diff --git a/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalCacheRequestFilter.java b/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalCacheRequestFilter.java index 3280930e1e6e40305434c0c22453ed424d992f6a..16cc6162acf974c89445a2bf42e0495ace7a4fc5 100644 --- a/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalCacheRequestFilter.java +++ b/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalCacheRequestFilter.java @@ -5,9 +5,14 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.HttpMethod; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; /** @@ -16,29 +21,36 @@ import reactor.core.publisher.Mono; * @author: zxfei * @date: 2022/6/20 16:59 */ -//@Component +@Component @Slf4j public class GlobalCacheRequestFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { - log.info("GlobalCacheRequestFilter:{}",getOrder()); - // GET DELETE 涓嶈繃婊� - HttpMethod method = exchange.getRequest().getMethod(); - if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) { + log.info("GlobalCacheRequestFilter:{}", getOrder()); + if (exchange.getRequest().getHeaders().getContentType() == null) { return chain.filter(exchange); + } else { + return DataBufferUtils.join(exchange.getRequest().getBody()) + .flatMap(dataBuffer -> { + DataBufferUtils.retain(dataBuffer); + Flux<DataBuffer> cachedFlux = Flux + .defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount()))); + ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator( + exchange.getRequest()) { + @Override + public Flux<DataBuffer> getBody() { + return cachedFlux; + } + }; + return chain.filter(exchange.mutate().request(mutatedRequest).build()); + }); } - return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> { - if (serverHttpRequest == exchange.getRequest()) { - return chain.filter(exchange); - } - return chain.filter(exchange.mutate().request(serverHttpRequest).build()); - }); } @Override public int getOrder() { - return 0; + return HIGHEST_PRECEDENCE; } } diff --git a/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalLogFilter.java b/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalLogFilter.java index 91f43aab693f4928c69c2691333d6b65d0f1958e..583643c0b991412cbc40c04b5347763fbb21f373 100644 --- a/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalLogFilter.java +++ b/smart-gateway/src/main/java/com/mortals/xhx/base/framework/filter/GlobalLogFilter.java @@ -11,6 +11,7 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; @@ -22,8 +23,10 @@ import reactor.core.publisher.Mono; import javax.sound.midi.Track; import java.net.URI; +import java.nio.CharBuffer; import java.nio.charset.StandardCharsets; import java.util.LinkedHashSet; +import java.util.concurrent.atomic.AtomicReference; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR; @@ -165,14 +168,16 @@ public class GlobalLogFilter implements GlobalFilter, Ordered { private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) { //鑾峰彇璇锋眰浣� Flux<DataBuffer> body = serverHttpRequest.getBody(); - StringBuilder sb = new StringBuilder(); + + AtomicReference<String> bodyRef = new AtomicReference<>(); body.subscribe(buffer -> { - byte[] bytes = new byte[buffer.readableByteCount()]; - buffer.read(bytes); - String bodyString = new String(bytes, StandardCharsets.UTF_8); - sb.append(bodyString); + CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer()); + DataBufferUtils.release(buffer); + bodyRef.set(charBuffer.toString()); }); - return sb.toString(); + //鑾峰彇request body + return bodyRef.get(); + } public static String getOriginalRequestUrl(ServerWebExchange exchange) {