Spring Cloud Gateway网关获取路由转发后的真实地址

目录

  • 配置文件
  • 代码
  • 结果

    在使用 Spring Cloud Gateway 时,我们可能需要获取路由转发后的地址(注意,这里的地址不是请求到网关的地址,是网关路由转发后的真实地址),下面通过代码演示如何在 filter 中获取路由转发后的地址。

    核心代码是 Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); 获取路由 route,然后才可以获取 route 的 uri(即配置文件中配置的 route 的 uri)

    配置文件

    spring:
      application:
        name: api-gateway
      cloud:
        gateway:
          routes:
            - id: path_route
              uri: http://127.0.0.1:8001
              predicates:
                - Path=/api/**
    

    代码

    实现全局过滤器 GlobalFilter

    @Component
    public class MyGlobalFilter implements GlobalFilter, Ordered { @Override
        public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 获得路由
            Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
            // 配置文件中配置的route的uri属性(匹配到的route),本例中是http://127.0.0.1:8001
            String uri = route.getUri().toString();
            ServerHttpRequest request = exchange.getRequest();
            // 请求路径中域名之后的部分,本例中是/api/name/get
            String path = request.getPath().toString();
            // 转发后的完整地址,本例中是http://127.0.0.1:8001/api/name/get
            String address = uri + path;
            System.out.println("uri: " + uri);
            System.out.println("path: " + path);
            System.out.println("转发后的完整地址 address: " + address);
            return chain.filter(exchange);
        }
        @Override
        public int getOrder() { return 0;
        }
    }
    

    结果

    网关地址:http://127.0.0.1:8090

    请求地址:http://127.0.0.1:8090/api/name/get

    想要访问接口的真实地址:http://127.0.0.1:8001/api/name/get

    以下是代码的执行结果:

    uri: http://127.0.0.1:8001
    path: /api/name/get
    转发后的完整地址 address: http://127.0.0.1:8001/api/name/get
    

    成功拿到路由转发后的地址


    如果有帮助的话,可以点个赞支持一下嘛🙏