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
相关产品推荐
相关产品推荐

