Spring Cloud Gateway 注入标头

问题描述 投票:0回答:4

在 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]
spring-cloud spring-cloud-gateway
4个回答
20
投票

以下代码有效:

ServerHttpRequest request = exchange.getRequest()
                .mutate()
                .header("x-jwt-assertion", jwt)
                .build();
ServerWebExchange exchange1 = exchange.mutate().request(request).build();
            return chain.filter(exchange1);

15
投票

你可以看看

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());
        };
    }
}

0
投票
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    exchange.getRequest()
            .mutate()
            .headers(httpHeaders -> httpHeaders.setBearerAuth("token"));
    return chain.filter(exchange);
}

0
投票

要添加标头,只需改变请求就足够了, 我们不需要改变交换

exchange
  .getRequest()
  .mutate()
  .header("NEW_HEADER_KEY", "HEADER_VAL")
  .build();

return exchange;
© www.soinside.com 2019 - 2024. All rights reserved.