|
@@ -1,71 +1,83 @@
|
|
|
package com.zd.gateway.filter;
|
|
package com.zd.gateway.filter;
|
|
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.slf4j.MDC;
|
|
|
|
|
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
|
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.core.io.buffer.DataBufferUtils;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
import org.springframework.http.HttpHeaders;
|
|
|
-import org.springframework.http.MediaType;
|
|
|
|
|
-import org.springframework.http.codec.HttpMessageReader;
|
|
|
|
|
|
|
+
|
|
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
|
|
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
|
|
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
|
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.MultiValueMap;
|
|
import org.springframework.util.MultiValueMap;
|
|
|
-import org.springframework.util.StreamUtils;
|
|
|
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
|
import reactor.core.publisher.Flux;
|
|
import reactor.core.publisher.Flux;
|
|
|
import reactor.core.publisher.Mono;
|
|
import reactor.core.publisher.Mono;
|
|
|
|
|
|
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.io.UnsupportedEncodingException;
|
|
|
import java.net.URI;
|
|
import java.net.URI;
|
|
|
-import java.nio.charset.StandardCharsets;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-//@Component
|
|
|
|
|
|
|
+@Component
|
|
|
@Slf4j(topic = "【gateway-http-body---】")
|
|
@Slf4j(topic = "【gateway-http-body---】")
|
|
|
public class RequestBodyFilter implements GlobalFilter, Ordered {
|
|
public class RequestBodyFilter implements GlobalFilter, Ordered {
|
|
|
|
|
|
|
|
- private final HttpMessageReader<String> messageReader;
|
|
|
|
|
-
|
|
|
|
|
- public RequestBodyFilter(HttpMessageReader<String> messageReader) {
|
|
|
|
|
- this.messageReader = messageReader;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
|
- log.info("============================ Request Begin =============================");
|
|
|
|
|
- log.info("traceId:{}", MDC.get("traceId"));
|
|
|
|
|
- log.info("Request path: {}", exchange.getRequest().getPath());
|
|
|
|
|
-
|
|
|
|
|
- HttpHeaders headers = exchange.getRequest().getHeaders();
|
|
|
|
|
- MediaType contentType = headers.getContentType();
|
|
|
|
|
- if (contentType != null && contentType.isCompatibleWith(MediaType.APPLICATION_JSON)) {
|
|
|
|
|
-// Flux<DataBuffer> body = exchange.getRequest().getBody();
|
|
|
|
|
-
|
|
|
|
|
- }else{
|
|
|
|
|
- log.info("Request query params: {}", exchange.getRequest().getQueryParams());
|
|
|
|
|
|
|
+ ServerHttpRequest request = exchange.getRequest();
|
|
|
|
|
+ URI URIPath = request.getURI();
|
|
|
|
|
+ String path = request.getPath().value();
|
|
|
|
|
+ String method = request.getMethodValue();
|
|
|
|
|
+ HttpHeaders headers = request.getHeaders();
|
|
|
|
|
+ log.info("============================================Request begin============================================");
|
|
|
|
|
+ log.info("Request Information :URI = {}, path = {},method = {},header = {}。", URIPath, path, method, headers);
|
|
|
|
|
+ if ("POST".equals(method)) {
|
|
|
|
|
+ return DataBufferUtils.join(exchange.getRequest().getBody())
|
|
|
|
|
+ .flatMap(dataBuffer -> {
|
|
|
|
|
+ byte[] bytes = new byte[dataBuffer.readableByteCount()];
|
|
|
|
|
+ dataBuffer.read(bytes);
|
|
|
|
|
+ try {
|
|
|
|
|
+ String bodyString = new String(bytes, "utf-8");
|
|
|
|
|
+ log.info("Request params :" + bodyString);
|
|
|
|
|
+ exchange.getAttributes().put("POST_BODY", bodyString);
|
|
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ DataBufferUtils.release(dataBuffer);
|
|
|
|
|
+ Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
|
|
|
|
|
+ DataBuffer buffer = exchange.getResponse().bufferFactory()
|
|
|
|
|
+ .wrap(bytes);
|
|
|
|
|
+ return Mono.just(buffer);
|
|
|
|
|
+ });
|
|
|
|
|
+ ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
|
|
|
|
|
+ exchange.getRequest()) {
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Flux<DataBuffer> getBody() {
|
|
|
|
|
+ return cachedFlux;
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ log.info("***********************************Request end**********************************");
|
|
|
|
|
+ return chain.filter(exchange.mutate().request(mutatedRequest)
|
|
|
|
|
+ .build()).then(Mono.fromRunnable(() -> {
|
|
|
|
|
+ log.info("*********************************** Response begin **********************************");
|
|
|
|
|
+ log.info("Response: code:{},headers:{}", exchange.getResponse().getStatusCode(),exchange.getResponse().getHeaders());
|
|
|
|
|
+ log.info("============================================ Response end ============================================");
|
|
|
|
|
+ }));
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ MultiValueMap<String, String> queryParams = request.getQueryParams();
|
|
|
|
|
+ log.info("Request params :{} " ,queryParams);
|
|
|
|
|
+ log.info("***********************************Request end**********************************");
|
|
|
|
|
+ return chain.filter(exchange).then(Mono.fromRunnable(() -> {
|
|
|
|
|
+ log.info("*********************************** Response begin **********************************");
|
|
|
|
|
+ log.info("Response: code:{},headers:{}", exchange.getResponse().getStatusCode(),exchange.getResponse().getHeaders());
|
|
|
|
|
+ log.info("============================================ Response end ============================================");
|
|
|
|
|
+ }));
|
|
|
}
|
|
}
|
|
|
- log.info("Request headers: {}", headers);
|
|
|
|
|
-
|
|
|
|
|
- return chain.filter(exchange).then(Mono.fromRunnable(() -> {
|
|
|
|
|
- log.info("Response status code: {}", exchange.getResponse().getStatusCode());
|
|
|
|
|
- log.info("Response headers: {}", exchange.getResponse().getHeaders());
|
|
|
|
|
- log.info("============================ Response End =============================");
|
|
|
|
|
- }));
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// private Mono<String> readJsonBody(Flux<DataBuffer> body) {
|
|
|
|
|
-// return this.messageReader.readMono(
|
|
|
|
|
-// Mono.just(ServerHttpRequestDecorator.empty().body(BodyInserters.fromDataBuffers(body))),
|
|
|
|
|
-// String.class,
|
|
|
|
|
-// MediaType.APPLICATION_JSON,
|
|
|
|
|
-// Map.of()
|
|
|
|
|
-// );
|
|
|
|
|
-// }
|
|
|
|
|
-
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public int getOrder() {
|
|
public int getOrder() {
|
|
|
return -10;
|
|
return -10;
|