You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Gateway自定义ModifyUri过滤器修改URI未生效问题求助

问题解决:Spring Cloud Gateway过滤器修改URI不生效

你的问题出在修改请求URI的方式不对——Spring Cloud Gateway最终转发的目标地址是由路由匹配阶段确定的GATEWAY_REQUEST_URL_ATTR属性决定的,单纯修改ServerHttpRequest的URI不会覆盖这个路由级别的配置。

正确的实现方式

要让网关转发到你指定的新地址,需要修改exchange中存储的网关请求URL属性,而不是只修改请求对象的URI。修改你的ModifyUri过滤器代码如下:

import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;

import java.net.URI;

public class ModifyUriGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {

    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            // 构造要转发的目标URI
            URI modifiedUri = URI.create("http://localhost:8999/new-path");
            // 修改网关内部存储的请求URL属性,这才是网关最终转发的地址
            exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, modifiedUri);
            // 继续执行过滤器链
            return chain.filter(exchange);
        };
    }
}

路由配置调整

另外,路由里的uri可以设为一个占位值(比如uri: forward:),因为它会被过滤器覆盖,避免混淆:

- id: myId
  uri: forward:
  predicates:
    - Path=/test/helloworld
    - Method=POST
  filters:
    - ModifyUri

关键说明

ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR是Spring Cloud Gateway内部用来存储最终转发地址的属性,所有路由和过滤器的最终转发逻辑都会读取这个值。只有修改这个属性,才能真正改变网关的目标转发地址。

内容的提问来源于stack exchange,提问作者ha22109

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:24:57