在Spring Cloud Gateway中,当你尝试直接修改ServerHttpRequest
的headers时,会遇到UnsupportedOperationException
。这是因为在Spring WebFlux中,ServerHttpRequest
的headers是不可变的。要修改请求头,你需要构建一个新的ServerHttpRequest
实例并替换原来的请求。
以下是如何在Spring Cloud Gateway过滤器中正确设置请求头的方法:
- 使用
ServerHttpRequest.Builder
来创建一个新的ServerHttpRequest
实例。 - 将原始请求的所有属性复制到新的请求中,并添加或修改所需的headers。
- 使用新的请求创建一个新的
ServerWebExchange
实例。 - 将新的
ServerWebExchange
实例传递给过滤器链。
以下是代码示例:
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest originalRequest = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
// 创建一个新的请求构建器,并复制原始请求的所有数据
ServerHttpRequest.Builder builder = originalRequest.mutate();
// 添加或修改请求头
builder.header("gateway", "gatewatest");
// 使用修改后的请求构建一个新的ServerWebExchange实例
ServerWebExchange newExchange = exchange.mutate().request(builder.build()).build();
// 继续过滤器链处理
return chain.filter(newExchange);
}
在这段代码中,mutate()
方法用于创建一个可修改的请求构建器。然后你可以添加或修改headers,并用修改后的请求构建一个新的ServerWebExchange
实例,最后将其传递给过滤器链。这样就可以避免UnsupportedOperationException
错误。