Java 我无法根据来自下游的响应头更改全局过滤器中的SpringCloudGate方式响应?

Java 我无法根据来自下游的响应头更改全局过滤器中的SpringCloudGate方式响应?,java,spring-cloud,Java,Spring Cloud,我的目标是通过使用ServerHttpResponseDecorator从下游服务器响应头接收一些令牌,如果没有这个,我无法在GlobalFilter中获取响应头。基于令牌,我计划通过引发自定义异常并在ErrorWebExceptionHandler中处理来更改下游响应 问题是,一旦我从下游服务读取了响应头,即使异常也无法停止流,我将获得来自下游服务的原始响应,但如果我在读取头之前引发异常,它将按预期工作 全局过滤器示例代码 @Component public class Cust

我的目标是通过使用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()); 
    }

}


@组成部分
公共类CustomFilter实现GlobalFilter,已订购{
@凌驾
public int getOrder(){
返回-2;
}
@凌驾
公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){
ServerHttpResponse originalResponse=exchange.getResponse();
ServerHttpResponseDecorator decoratedResponse=新的ServerHttpResponseDecorator(原始响应){
@凌驾
公共HttpHeaders getHeaders(){
字符串tokenFromHeader=super.getHeaders().getFirst(“令牌”);
字符串regIdFromHeader=super.getHeaders().getFirst(“regId”);
if(false){//if(true){异常处理程序按预期对其进行了隐藏
//我这里有一些中国逻辑
抛出新的RuntimeException();
}
if(tokenFromHeader!=null&®IdFromHeader!=null){
如果(真){
//我这里有一些中国逻辑
//没有用,我从下游得到了原始的响应
抛出新的RuntimeException();
}
}
返回getDelegate().getHeaders();
}
};
返回链.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));
        }
    }

公共类MyWebExceptionHandler实现ErrorWebExceptionHandler{
@凌驾
公共Mono句柄(ServerWebExchange,Throwable-ex){
byte[]bytes=(“一些自定义文本”).getBytes(StandardCharsets.UTF_8);
DataBuffer buffer=exchange.getResponse().bufferFactory().wrap(字节);
exchange.getResponse().getHeaders().add(“内容类型”,“应用程序/json;字符集=UTF-8”);
返回exchange.getResponse().writeWith(Flux.just(buffer));
}
}
预计产量为

一些自定义文本


但是我得到了一个原始响应

有关如何修改响应正文的示例,请参见。实际上,您正在尝试在收到响应之前修改它(tokenFromHeader!=null和®IdFromHeader!=null)为此,我添加了这个条件@Spencergibi尝试了一种不同的方法来修改回复正文,但没有像预期的那样在spring论坛上发布相同的内容。我将尝试您的示例@Spencergibsee,以了解如何修改回复正文。您实际上是在收到回复之前尝试修改回复(tokenFromHeader!=null&®IdFromHeader!=null)为此,我添加了此条件@Spencergibi尝试了一种不同的方法来修改响应正文,但没有按预期工作在spring论坛上发布相同的结果。我将尝试您的示例@Spencergib