springgateway网关修改响应后,部分中文乱码问题

原因

是因为响应体过大,开启了压缩,数据分段进行响应得,导致处理返回体得时候乱码

解决方式

复制代码
@Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse originalResponse = exchange.getResponse();
        DataBufferFactory bufferFactory = originalResponse.bufferFactory();
        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
            @Override
            public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {

                if (getStatusCode() != null && getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) {
                    Flux<? extends DataBuffer> fluxBody = Flux.from(body);
                    return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
                        DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
                        DataBuffer join = dataBufferFactory.join(dataBuffers);
                        byte[] content = new byte[join.readableByteCount()];
                        join.read(content);
                        DataBufferUtils.release(join);
                        //完整得响应体
                        String responseData = new String(content, StandardCharsets.UTF_8);
                        return bufferFactory.wrap(responseData.getBytes(StandardCharsets.UTF_8));
                    }));
                }
                return super.writeWith(body);
            }
        };
        return chain.filter(exchange.mutate().response(decoratedResponse).build());
    }
相关推荐
BD_Marathon4 小时前
【JUC】并发与并行
java
okseekw4 小时前
Java String类详解:不可变性、创建方式与比较方法
java
q***64974 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
降临-max5 小时前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
带刺的坐椅5 小时前
Solon AI 开发学习5 - chat - 支持哪些模型?及方言定制
java·ai·openai·solon
悟空码字5 小时前
单点登录:一次登录,全网通行
java·后端
傻啦嘿哟5 小时前
物流爬虫实战:某丰快递信息实时追踪技术全解析
java·开发语言·数据库
倚肆5 小时前
Spring Boot Security 全面详解与实战指南
java·spring boot·后端
茄子凉心5 小时前
android 开机启动App
android·java·开发语言
8***f3956 小时前
工作中常用springboot启动后执行的方法
java·spring boot·后端