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;
        }
    }
  • 相关阅读:
    CocoaPods的安装使用和常见问题
    超全iOS面试资料,看完你还担心面试吗?
    IOS--多线程之线程间通讯
    iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
    java之NIO编程
    libthrift0.9.0解析(四)之TThreadPoolServer&ServerContext
    android开发笔记
    rtsp转发服务器设计
    神经网络文献资料
    deep learning in nlp 资料文献
  • 原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/15558044.html
Copyright © 2011-2022 走看看