在使用 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 Monofilter(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
成功拿到路由转发后的地址
如果有帮助的话,可以点个赞支持一下嘛🙏