zoukankan      html  css  js  c++  java
  • spring gateway 重写 输出不起作用

    @Bean
        @Order(-100000)
        public GlobalFilter modifyResponseFilter() {
            return (exchange, chain) -> {
                ServerHttpResponse originalResponse = exchange.getResponse();
                DataBufferFactory bufferFactory = originalResponse.bufferFactory();
                ServerHttpResponseDecorator responseDecorator = new ServerHttpResponseDecorator(originalResponse) {
                    @Override
                    public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
                        if (body instanceof Flux) {
                            Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>)body;
                            return super.writeWith(fluxBody.map(dataBuffer -> {
                                byte[] buff = new byte[dataBuffer.readableByteCount()];
                                dataBuffer.read(buff);
                                String str = new String(buff);
                                ApiResult apiResult = new ApiResult();
                                apiResult.setS(originalResponse.getRawStatusCode());
                                apiResult.setR(JSONUtil.parseObj(str));
                                byte[] newBuff = JSONUtil.toJsonStr(apiResult).getBytes(StandardCharsets.UTF_8);
                                return bufferFactory.wrap(newBuff);
                            }));
                        }
                        return super.writeWith(body);
                    }
                };
                return chain.filter(exchange.mutate().response(responseDecorator).build());
            };
        }
    

      如上代码在配置类里面定义了一个bean,路由的接口会走filter方法但不会走writeWith,原因是@Order(-100000)不起作用,把上面代码改成如下就没问题了

    @Component
    public class GlobalModifyResponseFilter implements GlobalFilter, Ordered {
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpResponse originalResponse = exchange.getResponse();
            DataBufferFactory bufferFactory = originalResponse.bufferFactory();
            ServerHttpResponseDecorator responseDecorator = new ServerHttpResponseDecorator(originalResponse) {
                @Override
                public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
                    if (body instanceof Flux) {
                        Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>)body;
                        return super.writeWith(fluxBody.map(dataBuffer -> {
                            byte[] buff = new byte[dataBuffer.readableByteCount()];
                            dataBuffer.read(buff);
                            String str = new String(buff);
                            byte[] newBuff = JSONUtil.toJsonStr(ApiResultVO.success(str)).getBytes(StandardCharsets.UTF_8);
                            return bufferFactory.wrap(newBuff);
                        }));
                    }
                    return super.writeWith(body);
                }
            };
            return chain.filter(exchange.mutate().response(responseDecorator).build());
        }
    
        @Override
        public int getOrder() {
            return Integer.MIN_VALUE;
        }
    }
  • 相关阅读:
    隐含马尔科夫模型的训练
    隐马尔科夫模型
    联合概率、边缘概率、条件概率
    移除集合元素
    常用的概率分布:伯努利分布、二项式分布、多项式分布、先验概率,后验概率
    探索性数据分析EDA综述
    奇异值分解(SVD)原理及应用
    分类算法的评价
    【底层原理】数据库的最简单实现
    深度学习模型超参数搜索实用指南
  • 原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/15558044.html
Copyright © 2011-2022 走看看