lizw 3 years ago
parent
commit
5468d132e7

+ 10 - 0
TODO

@@ -0,0 +1,10 @@
+# -- Filter顺序 ---------------------------------------------------------------------------------------------
+用户
+🡓
+CacheRequestBodyGlobalFilter        (Integer.MIN_VALUE)         - 缓存请求body
+🡓
+SelectRouteGlobalFilter             (0)                         -
+🡓
+🡓
+业务处理
+# ---------------------------------------------------------------------------------------------------------------------

+ 6 - 1
gateway-server/src/main/java/com/galaxis/wms/GlobalConstant.java

@@ -5,5 +5,10 @@ package com.galaxis.wms;
  * 创建时间:2021/01/26 12:05 <br/>
  * 创建时间:2021/01/26 12:05 <br/>
  */
  */
 public interface GlobalConstant {
 public interface GlobalConstant {
-    String GATEWAY_RESPONSE_BODY_ATTR = GlobalConstant.class.getName() + ".gateway_response_body";
+    // String GATEWAY_RESPONSE_BODY_ATTR = GlobalConstant.class.getName() + ".gateway_response_body";
+
+    /**
+     * ServerWebExchange request body字符串缓存
+     */
+    String CACHED_REQUEST_BODY_STR_ATTR = "cachedRequestStrBody";
 }
 }

+ 82 - 72
gateway-server/src/main/java/com/galaxis/wms/filter/AuthGlobalFilter.java

@@ -1,72 +1,82 @@
-package com.galaxis.wms.filter;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.cloud.gateway.filter.GatewayFilterChain;
-import org.springframework.cloud.gateway.filter.GlobalFilter;
-import org.springframework.cloud.gateway.route.Route;
-import org.springframework.cloud.gateway.support.NotFoundException;
-import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
-import org.springframework.core.Ordered;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.stereotype.Component;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.util.UriComponentsBuilder;
-import reactor.core.publisher.Mono;
-
-import java.net.URI;
-
-/**
- * 全局认证请求
- * <p>
- * 作者:lizw <br/>
- * 创建时间:2021/01/26 11:36 <br/>
- */
-@Component
-@Slf4j
-public class AuthGlobalFilter implements GlobalFilter, Ordered {
-    private static final int ORDER = Ordered.LOWEST_PRECEDENCE - 1;
-
-    @Override
-    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-        ServerHttpRequest request = exchange.getRequest();
-        final String path = request.getPath().value();
-        final String method = StringUtils.upperCase(request.getMethodValue());
-        log.debug(" -> [{}] | {}", method, path);
-        // 当前Route
-        final Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
-        final String routeId = route != null ? route.getId() : null;
-        if (route == null || StringUtils.isBlank(routeId)) {
-            throw NotFoundException.create(true, "404 Not Found");
-        }
-        // 获取原来请求路径
-//        String requestPath = exchange.getAttribute(FilterDict.SYSTEM_REQUEST_PATH);
-
-//        Optional<Route> route = Optional.of(exchange.getAttribute(GATEWAY_ROUTE_ATTR));
-        Route newRoute = Route.async()
-                .asyncPredicate(route.getPredicate())
-                .filters(route.getFilters())
-                .id(route.getId())
-                .order(route.getOrder())
-                .uri("http://127.0.0.1:6666").build();
-//        ServerWebExchange mutateExchange = exchange.mutate().request(builder -> builder.uri(uri).build()).build();
-        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, newRoute);
-//        exchange.getAttributes().put(FilterDict.SYSTEM_APP_IP_ADDR, serviceAddress[0]);
-
-        URI uri = UriComponentsBuilder.
-                newInstance().scheme(exchange.getRequest().getURI().getScheme()).
-                host("127.0.0.1").port("6666")
-                .path("/wms/api").query(exchange.getRequest().getURI().getRawQuery()).build(true)
-                .toUri();
-
-        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, uri);
-
-        log.debug(" -> routeId={} | [{}] | {}", routeId, method, path);
-        return chain.filter(exchange);
-    }
-
-    @Override
-    public int getOrder() {
-        return ORDER;
-    }
-}
+//package com.galaxis.wms.filter;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.lang3.StringUtils;
+//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+//import org.springframework.cloud.gateway.filter.GlobalFilter;
+//import org.springframework.cloud.gateway.route.Route;
+//import org.springframework.cloud.gateway.route.builder.GatewayFilterSpec;
+//import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
+//import org.springframework.cloud.gateway.support.NotFoundException;
+//import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
+//import org.springframework.core.Ordered;
+//import org.springframework.http.server.reactive.ServerHttpRequest;
+//import org.springframework.stereotype.Component;
+//import org.springframework.web.server.ServerWebExchange;
+//import org.springframework.web.util.UriComponentsBuilder;
+//import reactor.core.publisher.Mono;
+//
+//import java.net.URI;
+//
+///**
+// * 全局认证请求
+// * <p>
+// * 作者:lizw <br/>
+// * 创建时间:2021/01/26 11:36 <br/>
+// */
+//@Component
+//@Slf4j
+//public class AuthGlobalFilter implements GlobalFilter, Ordered {
+//    private static final int ORDER = Ordered.LOWEST_PRECEDENCE - 1;
+//
+//    @Override
+//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+//        ServerHttpRequest request = exchange.getRequest();
+//        final String path = request.getPath().value();
+//        final String method = StringUtils.upperCase(request.getMethodValue());
+//        log.debug(" -> [{}] | {}", method, path);
+//        // 当前Route
+//        final Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
+//        final String routeId = route != null ? route.getId() : null;
+//        if (route == null || StringUtils.isBlank(routeId)) {
+//            throw NotFoundException.create(true, "404 Not Found");
+//        }
+//
+//        Route newRoute = Route.async()
+//                .asyncPredicate(route.getPredicate())
+//                .filters(route.getFilters())
+//                .id(route.getId())
+//                .order(route.getOrder())
+//                .uri("http://127.0.0.1:6666").build();
+////        ServerWebExchange mutateExchange = exchange.mutate().request(builder -> builder.uri(uri).build()).build();
+//        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, newRoute);
+//        URI uri = UriComponentsBuilder.
+//                newInstance().scheme(exchange.getRequest().getURI().getScheme()).
+//                host("127.0.0.1").port("6666")
+//                .path("/wms/api").query(exchange.getRequest().getURI().getRawQuery()).build(true)
+//                .toUri();
+//
+//        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, uri);
+//        log.debug(" -> routeId={} | [{}] | {}", routeId, method, path);
+//        return chain.filter(exchange);
+//    }
+//
+//    @Override
+//    public int getOrder() {
+//        return ORDER;
+//    }
+//
+//    public void test() {
+//        RouteLocatorBuilder builder = new RouteLocatorBuilder(null);
+//        builder.routes()
+//                .route(r -> r.path("/aaa")
+//                        .and()
+//                        .path("")
+//                        .filters(GatewayFilterSpec::preserveHostHeader).uri("http://127.0.0.1:3333")
+//                        ///.predicate(serverWebExchange -> {})
+//                        .id("")
+//                )
+//                // .route()
+//                .build();
+//    }
+//}

+ 54 - 0
gateway-server/src/main/java/com/galaxis/wms/filter/CacheRequestBodyGlobalFilter.java

@@ -0,0 +1,54 @@
+package com.galaxis.wms.filter;
+
+import com.galaxis.wms.GlobalConstant;
+import com.galaxis.wms.utils.ExchangeUtils;
+import lombok.extern.slf4j.Slf4j;
+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.http.codec.HttpMessageReader;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.HandlerStrategies;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+/**
+ * 作者:lizw <br/>
+ * 创建时间:2022/03/17 10:05 <br/>
+ */
+@Component
+@Slf4j
+public class CacheRequestBodyGlobalFilter implements GlobalFilter, Ordered {
+    private static final int ORDER = Ordered.HIGHEST_PRECEDENCE;
+    private static final List<HttpMessageReader<?>> MESSAGE_READERS = HandlerStrategies.withDefaults().messageReaders();
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        return ServerWebExchangeUtils.cacheRequestBody(exchange, serverHttpRequest -> {
+            final ServerWebExchange newExchange = ExchangeUtils.modifyRequestHeaders(exchange, serverHttpRequest);
+            // 获取 Request Body 参考 ReadBodyPredicateFactory
+            final Mono<String> mono = ServerRequest.create(newExchange, MESSAGE_READERS)
+                    .bodyToMono(String.class)
+                    .doOnNext(body -> {
+                        try {
+                            // log.info("body -> {}", body);
+                            newExchange.getAttributes().put(GlobalConstant.CACHED_REQUEST_BODY_STR_ATTR, body);
+                        } catch (Exception e) {
+                            log.error("缓存请求body处理失败", e);
+                        }
+                    });
+            // 合并Mono
+            return Flux.merge(mono, chain.filter(newExchange)).then();
+        });
+    }
+
+    @Override
+    public int getOrder() {
+        return ORDER;
+    }
+}

+ 0 - 55
gateway-server/src/main/java/com/galaxis/wms/filter/CacheResponseBodyGlobalFilter.java

@@ -1,55 +0,0 @@
-//package com.galaxis.wms.filter;
-//
-//import com.galaxis.wms.GlobalConstant;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.cloud.gateway.filter.GatewayFilter;
-//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
-//import org.springframework.cloud.gateway.filter.GlobalFilter;
-//import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
-//import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyResponseBodyGatewayFilterFactory;
-//import org.springframework.core.Ordered;
-//import org.springframework.stereotype.Component;
-//import org.springframework.web.server.ServerWebExchange;
-//import reactor.core.publisher.Mono;
-//
-///**
-// * 作者:lizw <br/>
-// * 创建时间:2021/04/29 09:25 <br/>
-// */
-//@Component
-//@Slf4j
-//public class CacheResponseBodyGlobalFilter implements GlobalFilter, Ordered {
-//    private static final int ORDER = NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER - 2;
-//    private static final int RESPONSE_BODY_MAX_LENGTH = 2047;
-//
-//    @Autowired
-//    private ModifyResponseBodyGatewayFilterFactory modifyResponseBodyGatewayFilterFactory;
-//
-//    @Override
-//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-//        final StringBuilder responseBody = new StringBuilder(RESPONSE_BODY_MAX_LENGTH);
-//        exchange.getAttributes().put(GlobalConstant.GATEWAY_RESPONSE_BODY_ATTR, responseBody);
-//        ModifyResponseBodyGatewayFilterFactory.Config config = new ModifyResponseBodyGatewayFilterFactory.Config()
-//                .setRewriteFunction(
-//                        String.class,
-//                        String.class,
-//                        (serverWebExchange, body) -> {
-//                            if (responseBody.length() < RESPONSE_BODY_MAX_LENGTH) {
-//                                responseBody.append(body);
-//                                if (responseBody.length() > RESPONSE_BODY_MAX_LENGTH) {
-//                                    responseBody.delete(RESPONSE_BODY_MAX_LENGTH, responseBody.length());
-//                                }
-//                            }
-//                            return Mono.just(body);
-//                        }
-//                );
-//        GatewayFilter delegate = modifyResponseBodyGatewayFilterFactory.apply(config);
-//        return delegate.filter(exchange, chain);
-//    }
-//
-//    @Override
-//    public int getOrder() {
-//        return ORDER;
-//    }
-//}

+ 49 - 0
gateway-server/src/main/java/com/galaxis/wms/filter/SelectRouteGlobalFilter.java

@@ -0,0 +1,49 @@
+package com.galaxis.wms.filter;
+
+import com.galaxis.wms.GlobalConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.route.Route;
+import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
+import org.springframework.core.Ordered;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+/**
+ * 作者:lizw <br/>
+ * 创建时间:2022/03/17 10:39 <br/>
+ */
+@Component
+@Slf4j
+public class SelectRouteGlobalFilter implements GlobalFilter, Ordered {
+    private static final int ORDER = 0;
+
+    private static final String CQ = "http://127.0.0.1:8182";
+    private static final String GX = "http://127.0.0.1:3334";
+    private static final String PZH = "http://127.0.0.1:3334";
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        String body = exchange.getAttribute(GlobalConstant.CACHED_REQUEST_BODY_STR_ATTR);
+
+
+
+        final Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
+        assert route != null;
+        Route newRoute = Route.async()
+                .asyncPredicate(route.getPredicate())
+                .filters(route.getFilters())
+                .id(route.getId())
+                .order(route.getOrder())
+                .uri("http://127.0.0.1:3334").build();
+        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, newRoute);
+        return chain.filter(exchange);
+    }
+
+    @Override
+    public int getOrder() {
+        return ORDER;
+    }
+}

+ 42 - 0
gateway-server/src/main/java/com/galaxis/wms/utils/ExchangeUtils.java

@@ -0,0 +1,42 @@
+package com.galaxis.wms.utils;
+
+import org.springframework.http.HttpCookie;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
+import org.springframework.lang.NonNull;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.server.ServerWebExchange;
+
+import java.util.ArrayList;
+
+/**
+ * 作者:lizw <br/>
+ * 创建时间:2020/07/06 17:44 <br/>
+ */
+public class ExchangeUtils {
+    /**
+     * 为了能重写Cookies包装原始ServerHttpRequest
+     */
+    public static ServerWebExchange modifyRequestHeaders(ServerWebExchange exchange, ServerHttpRequest serverHttpRequest) {
+        final HttpHeaders headers = new HttpHeaders();
+        serverHttpRequest.getHeaders().forEach((name, values) -> headers.put(name, new ArrayList<>(values)));
+        final MultiValueMap<String, HttpCookie> cookies = new LinkedMultiValueMap<>(serverHttpRequest.getCookies().size());
+        cookies.addAll(serverHttpRequest.getCookies());
+        ServerHttpRequest newRequest = new ServerHttpRequestDecorator(serverHttpRequest) {
+            @NonNull
+            @Override
+            public HttpHeaders getHeaders() {
+                return headers;
+            }
+
+            @NonNull
+            @Override
+            public MultiValueMap<String, HttpCookie> getCookies() {
+                return cookies;
+            }
+        };
+        return exchange.mutate().request(newRequest).build();
+    }
+}

+ 3 - 5
gateway-server/src/main/resources/application-dev.yml

@@ -4,10 +4,8 @@
 spring:
 spring:
   cloud.gateway:
   cloud.gateway:
     routes:
     routes:
-      - id: test
-        uri: http://127.0.0.1:3333
+      - id: any
+        uri: http://127.0.0.1:1
         order: 0
         order: 0
-        filters:
-          - PreserveHostHeader
         predicates:
         predicates:
-          - Path=/wms/api
+          - Path=/**