java我不能根据下游的响应头更改全局过滤器中的Spring cloud gate方式响应吗?
我的目标是通过使用ServerHttpResponseDecorator从下游服务器响应头接收一些令牌,如果没有这个,我无法在GlobalFilter中获取响应头。基于令牌,我计划通过引发自定义异常并在ErrorWebExceptionHandler中处理来更改下游响应
问题是,一旦我从下游服务读取了响应头,即使异常也无法停止流,我将获得来自下游服务的原始响应,但如果我在读取头之前引发异常,它将按预期工作
全局过滤器示例代码
@Component
public class CustomFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return -2;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponse originalResponse = exchange.getResponse();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public HttpHeaders getHeaders() {
String tokenFromHeader = super.getHeaders().getFirst("TOKEN");
String regIdFromHeader = super.getHeaders().getFirst("regId");
if (false) { // if (true) { It is hadled by exception handler as expected
// I have some Buginese logic here
throw new RuntimeException();
}
if (tokenFromHeader != null && regIdFromHeader != null) {
if (true) {
//I have some Buginese logic here
// No use I am getting original response from down streams
throw new RuntimeException();
}
}
return getDelegate().getHeaders();
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
}
异常处理程序
public class MyWebExceptionHandler implements ErrorWebExceptionHandler {
@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
byte[] bytes = ( "Some custom text").getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
exchange.getResponse().getHeaders().add("Content-Type", "application/json;charset=UTF-8");
return exchange.getResponse().writeWith(Flux.just(buffer));
}
}
预计产量为
一些自定义文本
但我得到了一个原始的回应
共 (0) 个答案