Spring-Cloud-Gateway 请求标头过滤器不起作用

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

我想删除 spring-cloud-gateway 中的授权标头。 spring 文档不可能做到这一点,因为标头是只读的。以下代码抛出 UnexpectedOperationException

filters:
   - AddRequestHeader=X-Custom-Header,CustomValue
   - RemoveRequestHeader=Sensitive-Header

这是我在 application.yml 中配置的一部分。

spring:
  cloud:
    gateway:
      routes:
        - id: test-route
          uri: http://52.20.148.183
          predicates:
            - Path=/test/**
          filters:
            - StripPrefix=1

每次尝试删除代码中的标头,例如使用 GlobalFilter 和 Exchange.mutate()...,我都会遇到错误。

只有这样通过 chat-gpt 才有效:

public class CustomRequestDecorator extends ServerHttpRequestDecorator {

    public CustomRequestDecorator(ServerHttpRequest delegate) {
        super(delegate);
    }

    @Override
    public HttpHeaders getHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.putAll(super.getHeaders());
        headers.remove(HttpHeaders.AUTHORIZATION);
        headers.remove("Postman-Token");
        return headers;
    }
}

@Component
public class RemoveAuthenticationHeaderFilter implements GlobalFilter {
    private Logger logger = LoggerFactory.getLogger(RemoveAuthenticationHeaderFilter.class);
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        logger.info("Removing authentication header");
        var customRequest = new CustomRequestDecorator(exchange.getRequest());
        var newExchange = exchange.mutate().request(customRequest).build();
        return chain.filter(newExchange);
    }
}

我是不是搞错了?对于未来来说,这不是一个好的解决方案,因为使用默认过滤器来改变请求标头是不可能的。

spring-boot spring-webflux gateway request-headers mutate
1个回答
0
投票

断路器也有同样的问题。问题是来自 netty 的 ReadOnlyHttpHeaders。

java.lang.UnsupportedOperationException:null 在 org.springframework.http.ReadOnlyHttpHeaders.remove(ReadOnlyHttpHeaders.java:135)

https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/gatewayfilter-factories/removerequestheader-factory.html 也不起作用。

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
        </dependency>
spring:
  cloud:
    gateway:
      routes:
        - id: test-route
          uri: id: test-route
          uri: http://httpbin.org/
          predicates:
            - Path=/test/**
          filters:
            - StripPrefix=1
            - name: CircuitBreaker
              args:
                name: exampleCircuitBreaker
                fallbackUri: forward:/fallback
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.