zhb.dong пре 1 година
родитељ
комит
81f8975a54

+ 1 - 1
zd-gateway/src/main/java/com/zd/gateway/filter/AuthFilter.java

@@ -27,7 +27,7 @@ import javax.annotation.Resource;
  *
  * @author zd
  */
-@Component
+//@Component
 public class AuthFilter implements GlobalFilter, Ordered {
 
     private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);

+ 6 - 1
zd-gateway/src/main/java/com/zd/gateway/filter/RequestBodyFilter.java

@@ -10,16 +10,21 @@ import org.springframework.core.io.buffer.DataBufferUtils;
 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.ServerHttpRequestDecorator;
 import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
 import org.springframework.util.StreamUtils;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
 import java.nio.charset.StandardCharsets;
 
 
-@Component
+//@Component
 @Slf4j(topic = "【gateway-http-body---】")
 public class RequestBodyFilter implements GlobalFilter, Ordered {
 

+ 78 - 0
zd-gateway/src/main/java/com/zd/gateway/filter/WrapperRequestGlobalFilter.java

@@ -0,0 +1,78 @@
+package com.zd.gateway.filter;
+
+import lombok.extern.slf4j.Slf4j;
+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.HttpHeaders;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
+import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+
+@Component
+@Slf4j
+public class WrapperRequestGlobalFilter implements GlobalFilter, Ordered {
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        ServerHttpRequest request = exchange.getRequest();
+        URI URIPath = request.getURI();
+        String path = request.getPath().value();
+        String method = request.getMethodValue();
+        HttpHeaders header = request.getHeaders();
+        log.info("");
+        log.info("***********************************请求信息**********************************");
+        log.info("请求request信息:URI = {}, path = {},method = {},header = {}。", URIPath, path, method, header);
+        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("请求参数:" + 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("****************************************************************************\n");
+                        return chain.filter(exchange.mutate().request(mutatedRequest)
+                                .build());
+                    });
+        } else if ("GET".equals(method)) {
+            MultiValueMap<String, String> queryParams = request.getQueryParams();
+            log.info("请求参数:" + queryParams);
+            log.info("****************************************************************************\n");
+            return chain.filter(exchange);
+        }
+        log.info("****************************************************************************\n");
+        return chain.filter(exchange);
+    }
+
+    @Override
+    public int getOrder() {
+        return Ordered.HIGHEST_PRECEDENCE;
+    }
+}

+ 61 - 0
zd-gateway/src/main/java/com/zd/gateway/filter/WrapperResponseGlobalFilter.java

@@ -0,0 +1,61 @@
+package com.zd.gateway.filter;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.reactivestreams.Publisher;
+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.DataBufferFactory;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.Charset;
+
+
+@Component
+@Slf4j
+public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        ServerHttpResponse originalResponse = exchange.getResponse();
+        DataBufferFactory bufferFactory = originalResponse.bufferFactory();
+        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
+            @Override
+            public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
+                if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) {
+                    Flux<? extends DataBuffer> fluxBody = Flux.from(body);
+                    return super.writeWith(fluxBody.map(dataBuffer -> {
+                        byte[] content = new byte[dataBuffer.readableByteCount()];
+                        dataBuffer.read(content);
+                        //释放掉内存
+                        DataBufferUtils.release(dataBuffer);
+                        //responseData就是下游系统返回的内容,可以查看修改
+                        String responseData = new String(content, Charset.forName("UTF-8"));
+                        log.info("");
+                        log.info("***********************************响应信息**********************************");
+                        log.info("响应内容:{}", responseData);
+                        log.info("****************************************************************************\n");
+                        byte[] uppedContent = new String(content, Charset.forName("UTF-8")).getBytes();
+                        return bufferFactory.wrap(uppedContent);
+                    }));
+                } else {
+                    log.error("响应code异常:{}", getStatusCode());
+                }
+                return super.writeWith(body);
+            }
+        };
+        return chain.filter(exchange.mutate().response(decoratedResponse).build());
+    }
+
+    @Override
+    public int getOrder() {
+        return -2;
+    }
+}