在使用 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<Void> 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

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


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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐