Commit 2e8d5f15 authored by 赵啸非's avatar 赵啸非

修改网关日志

parent 6caefb4c
...@@ -5,9 +5,14 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain; ...@@ -5,9 +5,14 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered; 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.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
/** /**
...@@ -16,29 +21,36 @@ import reactor.core.publisher.Mono; ...@@ -16,29 +21,36 @@ import reactor.core.publisher.Mono;
* @author: zxfei * @author: zxfei
* @date: 2022/6/20 16:59 * @date: 2022/6/20 16:59
*/ */
//@Component @Component
@Slf4j @Slf4j
public class GlobalCacheRequestFilter implements GlobalFilter, Ordered { public class GlobalCacheRequestFilter implements GlobalFilter, Ordered {
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("GlobalCacheRequestFilter:{}",getOrder()); log.info("GlobalCacheRequestFilter:{}", getOrder());
// GET DELETE 不过滤 if (exchange.getRequest().getHeaders().getContentType() == null) {
HttpMethod method = exchange.getRequest().getMethod();
if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) {
return chain.filter(exchange);
}
return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> {
if (serverHttpRequest == exchange.getRequest()) {
return chain.filter(exchange); 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(serverHttpRequest).build()); };
return chain.filter(exchange.mutate().request(mutatedRequest).build());
}); });
}
} }
@Override @Override
public int getOrder() { public int getOrder() {
return 0; return HIGHEST_PRECEDENCE;
} }
} }
...@@ -11,6 +11,7 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain; ...@@ -11,6 +11,7 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -22,8 +23,10 @@ import reactor.core.publisher.Mono; ...@@ -22,8 +23,10 @@ import reactor.core.publisher.Mono;
import javax.sound.midi.Track; import javax.sound.midi.Track;
import java.net.URI; import java.net.URI;
import java.nio.CharBuffer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.concurrent.atomic.AtomicReference;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR;
...@@ -165,14 +168,16 @@ public class GlobalLogFilter implements GlobalFilter, Ordered { ...@@ -165,14 +168,16 @@ public class GlobalLogFilter implements GlobalFilter, Ordered {
private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) { private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {
//获取请求体 //获取请求体
Flux<DataBuffer> body = serverHttpRequest.getBody(); Flux<DataBuffer> body = serverHttpRequest.getBody();
StringBuilder sb = new StringBuilder();
AtomicReference<String> bodyRef = new AtomicReference<>();
body.subscribe(buffer -> { body.subscribe(buffer -> {
byte[] bytes = new byte[buffer.readableByteCount()]; CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
buffer.read(bytes); DataBufferUtils.release(buffer);
String bodyString = new String(bytes, StandardCharsets.UTF_8); bodyRef.set(charBuffer.toString());
sb.append(bodyString);
}); });
return sb.toString(); //获取request body
return bodyRef.get();
} }
public static String getOriginalRequestUrl(ServerWebExchange exchange) { public static String getOriginalRequestUrl(ServerWebExchange exchange) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment