【BUG】ServerHttpResponseDecorator失效

1.BUG描述

  1. BUG描述

在Spring Cloud Gateway使用编码的方式实现一个全局拦截器,在全局拦截器中想要打印响应日志。

于是自己装饰了一个具有打印日志功能的ServerHttpResponseDecorator,但是在转发后的服务返回响应的时候,ServerHttpResponseDecorator的writeWith却并没有执行

@Component
@Slf4j
public class CustomGlobaFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //响应日志
        return handleResponse(exchange, chain);
    }

    public Mono<Void> handleResponse(ServerWebExchange exchange, GatewayFilterChain chain) {
        try {
            ServerHttpResponse originalResponse = exchange.getResponse();
            // 缓存数据的工厂
            DataBufferFactory bufferFactory = originalResponse.bufferFactory();
            // 拿到响应码
            HttpStatus statusCode = originalResponse.getStatusCode();
            if (statusCode == HttpStatus.OK) {
                // 装饰,增强能力
                ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
                    // 等调用完转发的接口后才会执行
                    @Override
                    public Mono<Void>  writeWith(Publisher<? extends DataBuffer> body) {
                        log.info("body instanceof Flux: {}", (body instanceof Flux));
                        if (body instanceof Flux) {
                            Flux<? extends DataBuffer> fluxBody = Flux.from(body);
                            // 往返回值里写数据
                            // 拼接字符串
                            return super.writeWith(
                                    fluxBody.map(dataBuffer -> {
                                        byte[] content = new byte[dataBuffer.readableByteCount()];
                                        dataBuffer.read(content);
                                        //释放掉内存
                                        DataBufferUtils.release(dataBuffer);
                                        // 构建日志
                                        StringBuilder sb2 = new StringBuilder(200);
                                        List<Object> rspArgs = new ArrayList<>();
                                        rspArgs.add(originalResponse.getStatusCode());
                                        //data
                                        String data = new String(content, StandardCharsets.UTF_8); 
                                        sb2.append(data);
                                        // 打印日志
                                        log.info("响应结果:" + data);
                                        return bufferFactory.wrap(content);
                                    }));
                        } else {
                            // 8. 调用失败,返回一个规范的错误码
                            log.error("<--- {} 响应code异常", getStatusCode());
                        }
                        return super.writeWith(body);
                    }
                };
                // 设置 response 对象为装饰过的
                return chain.filter(exchange.mutate().response(decoratedResponse).build());
            }
            // 降级处理返回数据
            return chain.filter(exchange); 
        } catch (Exception e) {
            log.error("网关处理响应异常" + e);
            return chain.filter(exchange);
        }
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

2.BUG解决

将这种写法

@Slf4j
@Component
@Order(-2) <--------------将这个
public class CustomGlobalFilter implements GlobalFilter , Ordered {
........省略
}

改为这种方式

    @Override
    public int getOrder() {
        return -2;
    }

3.BUG分析

查阅官网文档

  1. 官网文档案例采用的是实现接口的方式
    @Override
    public int getOrder() {
        return -2;
    }
  1. 查阅资料之后没有找到详细的解答,还是遵循官方的规范吧,时间有限,不纠结,意义不大。

相关推荐

  1. 设置失效时间失效的问题

    2024-04-20 11:44:03       32 阅读
  2. 【VUE】watch 监听失效

    2024-04-20 11:44:03       58 阅读
  3. 索引失效的情况

    2024-04-20 11:44:03       55 阅读
  4. 索引失效场景

    2024-04-20 11:44:03       44 阅读
  5. goland debug断点失效

    2024-04-20 11:44:03       57 阅读
  6. 【BUG】ServerHttpResponseDecorator失效

    2024-04-20 11:44:03       39 阅读
  7. Eureka删除失效服务

    2024-04-20 11:44:03       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-20 11:44:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-20 11:44:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-20 11:44:03       82 阅读
  4. Python语言-面向对象

    2024-04-20 11:44:03       91 阅读

热门阅读

  1. 【python脚本】课表信息生成 course_test(源代码)

    2024-04-20 11:44:03       35 阅读
  2. 算法和数据结构简介

    2024-04-20 11:44:03       85 阅读
  3. 2024深圳国际机器人展览会

    2024-04-20 11:44:03       38 阅读
  4. 浅谈微软的编译器MSVC

    2024-04-20 11:44:03       39 阅读
  5. LED灯降压恒流驱动芯片5~60v输出1.5A大电流AP51656

    2024-04-20 11:44:03       36 阅读
  6. 【设计模式】4、prototype 原型模式

    2024-04-20 11:44:03       36 阅读