有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案