如何修改spring云网关自定义写入GlobalFilter查询参数值



我已经在我的spring启动项目中配置了spring云网关。我的要求是,我想改变查询参数值自定义编写org.springframework.cloud.gateway.filter.GlobalFilter .

e。邮差请求- http://localhost:8080/employee/message?q1=abc123年,q2 =

期望的过滤器重定向- http://localhost:8080/employee/message?q1=xyz789年,q2 =

这样,我的控制器将得到q1值为xyz和q2值为789而是原始值。所以我想改变我的查询参数的值,根据业务情况。我能够在我的过滤器中获得查询参数,但不能确切地弄清楚如何更改它们。

下面是我的自定义过滤器
@Component
public class PreFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

ServerWebExchange modExchange = changeQueryParams(exchange);
return chain.filter(modExchange);
}

private static ServerWebExchange changeQueryParams(ServerWebExchange exchange)  {
ServerHttpRequest request = exchange.getRequest();

Map<String, List<String>> map = new HashMap<>();
map.put("q1", Arrays.asList("xyz"));
map.put("q2", Arrays.asList("789"));
MultiValueMap<String, String> newMultiValueMap = new LinkedMultiValueMap<>(map);

Builder builder = request.mutate();
request = builder.uri(UriComponentsBuilder.fromUri(exchange.getRequest()
.getURI())
.replaceQueryParams(newMultiValueMap)
.build()
.toUri()).build();
ServerWebExchange modifiedExchange = exchange.mutate().request(request).build();
return modifiedExchange;
}
}

Spring boot version = 2.7.0

我遇到了同样的问题。所以我会给出我的解决方法。

问题在于org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter在任何全局过滤器运行之前将URI写入exchange属性

所以你可以在GatewayFilter中重写,然后需要在每个路由上定义,或者在hack中(Kotlin中的代码,而不是Java):

val attributeUrl = exchange.attributes[ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR] as URI
val newUri = updateUriQueryParameters(attributeUrl)
exchange.attributes[ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR] = newUri

我们的网关有很多路由,所以我选择了后者。