【问题标题】:Spring Cloud Gateway inject headerSpring Cloud Gateway 注入头
【发布时间】:2018-09-25 11:40:16
【问题描述】:

在 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]

【问题讨论】:

  • 你必须在请求上调用 mutate,然后在交换上调用 mutate
  • 调用mutate方法如下: ServerHttpRequest request = exchange.getRequest() .mutate() .header("headerkey", jwt) .build(); exchange.mutate().request(request).build();返回链。过滤器(交换);但是,标头不会注入到后端 api。我做错了吗?
  • 我没有足够的信息可以说

标签: spring-cloud spring-cloud-gateway


【解决方案1】:

以下代码有效:

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

【讨论】:

    【解决方案2】:

    你可以看看

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

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2021-07-23
      • 1970-01-01
      • 2021-02-05
      • 2021-10-20
      • 2020-09-05
      • 2019-06-24
      • 2020-06-22
      • 2021-12-28
      相关资源
      最近更新 更多