Spring Cloud Gateway转发下游前如何修改query string参数?可通过application.yml配置吗
结论
无法直接通过纯application.yml配置实现该需求。Spring Cloud Gateway 官方内置的路由过滤器仅支持对query参数执行新增、删除操作,没有提供自定义参数值替换逻辑的配置项,你需要通过编写自定义过滤器代码完成需求。
实现方案参考
你可以选择自定义全局过滤器(对所有路由生效)或者自定义路由过滤器(仅对指定路由生效)实现参数替换逻辑,以下是全局过滤器的示例代码:
import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Mono; @Component public class QueryCharReplaceFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest originalRequest = exchange.getRequest(); // 不存在目标参数直接放行 if (!originalRequest.getQueryParams().containsKey("query")) { return chain.filter(exchange); } String originalQueryVal = originalRequest.getQueryParams().getFirst("query"); if (originalQueryVal == null || !originalQueryVal.contains("|")) { return chain.filter(exchange); } // 替换|为空格,重新构造请求URI String replacedQueryVal = originalQueryVal.replace("|", " "); ServerHttpRequest modifiedRequest = originalRequest.mutate() .uri(UriComponentsBuilder.fromUri(originalRequest.getURI()) .replaceQueryParam("query", replacedQueryVal) .build() .toUri()) .build(); return chain.filter(exchange.mutate().request(modifiedRequest).build()); } @Override public int getOrder() { // 设置较高优先级,保证在路由转发前执行 return -1; } }
如果仅需要对指定路由生效,可以将上述逻辑改为自定义路由过滤器工厂,之后在application.yml的对应路由配置中引用该过滤器即可。
内容的提问来源于stack exchange,提问作者webduvet
相关产品推荐
相关产品推荐

