В GatewayFilter я пытаюсь вставить заголовок в запрос, как показано ниже.
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//DO SOME AUTHORIZATION OPERATIONS
String jwt = "xxxxx"
exchange.getRequest().getHeaders().add("headerkey", jwt);
return chain.filter(exchange);
}
Но я получаю следующую ошибку:
java.lang.UnsupportedOperationException: null
at java.util.Collections$UnmodifiableMap.computeIfAbsent(Collections.java:1535) ~[na:1.8.0_111]
at org.springframework.http.HttpHeaders.add(HttpHeaders.java:1425) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at com.trimble.sample.springcloudgateway.filter.AuthGatewayFilter.filter(AuthGatewayFilter.java:30) ~[classes/:na]
at org.springframework.cloud.gateway.filter.OrderedGatewayFilter.filter(OrderedGatewayFilter.java:44) ~[spring-cloud-gateway-core-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
at org.springframework.cloud.gateway.handler.FilteringWebHandler$DefaultGatewayFilterChain.filter(FilteringWebHandler.java:103) ~[spring-cloud-gateway-core-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
at org.springframework.cloud.gateway.filter.NettyWriteResponseFilter.filter(NettyWriteResponseFilter.java:62) ~[spring-cloud-gateway-core-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
at org.springframework.cloud.gateway.handler.FilteringWebHandler$GatewayFilterAdapter.filter(FilteringWebHandler.java:121) ~[spring-cloud-gateway-core-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
at org.springframework.cloud.gateway.filter.OrderedGatewayFilter.filter(OrderedGatewayFilter.java:44) ~[spring-cloud-gateway-core-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
at org.springframework.cloud.gateway.handler.FilteringWebHandler$DefaultGatewayFilterChain.filter(FilteringWebHandler.java:103) ~[spring-cloud-gateway-core-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
Вызывают методы изменения, как показано ниже: ServerHttpRequest request = exchange.getRequest () .mutate () .header ("headerkey", jwt) .build (); exchange.mutate (). request (запрос) .build (); return chain.filter (обмен); Однако заголовок не вводится в API серверной части. Я что делаю неправильно?
Я не знаю достаточно информации, чтобы сказать





Приведенный ниже код работает:
ServerHttpRequest request = exchange.getRequest()
.mutate()
.header("x-jwt-assertion", jwt)
.build();
ServerWebExchange exchange1 = exchange.mutate().request(request).build();
return chain.filter(exchange1);
Вы можете взглянуть на
org.springframework.cloud.gateway.filter.factory.*GatewayFilterFactory
Есть много полезных реализаций фильтров шлюза.
На ваш вопрос,
org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactory
имеет стандартную реализацию.
public class AddRequestHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.header(config.getName(), config.getValue())
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
}
Вы должны вызвать mutate по запросу, а затем вызвать mutate на бирже.