我想删除 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);
}
}
我是不是搞错了?对于未来来说,这不是一个好的解决方案,因为使用默认过滤器来改变请求标头是不可能的。
断路器也有同样的问题。问题是来自 netty 的 ReadOnlyHttpHeaders。
java.lang.UnsupportedOperationException:null 在 org.springframework.http.ReadOnlyHttpHeaders.remove(ReadOnlyHttpHeaders.java:135)
<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