0
点赞
收藏
分享

微信扫一扫

springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码

我是芄兰 2023-09-28 阅读 37


记录一下困扰一星期的问题!

在全局过滤器中,获取响应体进行加密操作,在拿到byte[]之后转成String,控制台打印出来是乱码,编码也加了UTF-8还是报错。

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpResponse originalResponse = exchange.getResponse();
        DataBufferFactory bufferFactory = originalResponse.bufferFactory();
        originalResponse.getHeaders().add("Content-Type", MediaType.APPLICATION_JSON);

        ServerHttpResponseDecorator decoratedResponse = 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.buffer().map(dataBuffers -> {

                        DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
                        DataBuffer dataBuffer = dataBufferFactory.join(dataBuffers);
                        byte[] content = new byte[dataBuffer.readableByteCount()];
                        dataBuffer.read(content);
                        // 乱码
                        String s = new String(content, Charsets.UTF_8);

                        System.out.println(s);
                        DataBufferUtils.release(dataBuffer);

                        return bufferFactory.wrap(content);
                    }));

                }
                // if body is not a flux. never got there.
                return super.writeWith(body);
            }
        };
        // replace response with decorator
        return chain.filter(exchange.mutate().response(decoratedResponse).build());

    }

控制台输出:

springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码_ide_02

springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码_ide_03编辑

 解决办法:

springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码_JSON_04

在拿到服务返回的请求体中有一个gzip编码,做一个解密就可以了。

springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码_System_06

springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码_JSON_07编辑

/**
     * 解码 gzip
     * @param bytes
     * @return
     */
    public static byte[] uncompress(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        try {
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
        } catch (IOException e) {
            log.error("gzip uncompress error.", e);
        }

        return out.toByteArray();
    }

    /**
     * 编码 gzip
     * @param str
     * @param encoding
     * @return
     */
    public static byte[] compress(String str, String encoding) {
        if (str == null || str.length() == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(str.getBytes(encoding));
            gzip.close();
        } catch (IOException e) {
            log.error("gzip compress error.", e);
        }
        return out.toByteArray();

    }

 解决!!!


举报

相关推荐

0 条评论