首页 > 其他分享 >springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码

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

时间:2023-09-28 10:31:38浏览次数:32  
标签:return String springcloud 乱码 gzip new byte out


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

在全局过滤器中,获取响应体进行加密操作,在拿到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

控制台输出:

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

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

 解决办法:

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

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

在拿到服务返回的请求体中有一个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();

    }

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

 解决!!!


标签:return,String,springcloud,乱码,gzip,new,byte,out
From: https://blog.51cto.com/u_15808092/7636448

相关文章

  • SpringCloud之配置中心&swagger聚合
    1.什么是服务配置中心首先我们来看一下,微服务架构下关于配置文件的一些问题:1.配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。2.配置文件无法区分环境。微服务项目可能会有多个环境,例如:测......
  • How to add a string that contains whitespace to array in shell script All In One
    HowtoaddastringthatcontainswhitespacetoarrayinshellscriptAllInOneIhavetriedsomewaystoaddastringwhichcontainwhitespacetoarrayinshellscript,butfailed.stringvariablesconcatenate#!/usr/bin/envbashstr1="hello&qu......
  • redis存入key值乱码
    一问题我的key值是:codes:12345, 但存入redis后出现了乱码  二解决使用StringRedisTemplate 结果如下图 ......
  • jenkins自动部署web项目到tomcat 和 本地启动不一致 tomact log中文乱码
    最近项目使用jenkins来自动化部署,部署后发现catalina.out日志中文是乱码的。如果使用手动部署不经过Jenkins的话项目就一切正常。所以我想有可能是因为jenkins部署的时候,导致目标服务器那边获取不到相应的环境变量。在tomcat日志中发现,手动启动使用的是自己安装的JDK,而用jenkins......
  • keil5 注释乱码
    1.2. ......
  • springcloud微服务03-heima2023
    在微服务远程调用的过程中,还存在几个问题需要解决。首先是业务健壮性问题:例如在之前的查询购物车列表业务中,购物车服务需要查询最新的商品信息,与购物车数据做对比,提醒用户。大家设想一下,如果商品服务查询时发生故障,查询购物车列表在调用商品服务时,是不是也会异常?从而导致购物车......
  • Java String类的 equals、==和intern()
    Java实例的生成我们都知道,java中new一个类的实例是在JVM的堆中完成的,如下图所示:在这里我们以String类为例讲解一些更为细节的东西!String生成实例的代码如下:String str=new String("hello");对于通过new产生一个字符串(假设为” hello”)时,会先去上图的常量池中查找是否已经有了......
  • 处理日期格式问题:JSON.stringify 导致日期少一天的解决方案
    在前端开发中,经常需要处理日期数据。然而,由于JavaScript日期的表示方式以及JSON格式化日期的一些特性,可能会导致日期数据在传输或存储过程中出现问题。一个常见的问题是使用JSON.stringify对日期进行序列化时,导致日期少一天。在这篇文章中,我们将探讨这个问题,并提供解决方案。......
  • hive string, map, struct类型的建表和导入数据语句
    本文转载于 https://blog.51cto.com/u_14405/6419362,https://blog.csdn.net/tototuzuoquan/article/details/115493697和 https://blog.csdn.net/weixin_43597208/article/details/117450579。今天要用到hive的string相关的数据类型和数据,直接附链接和sql语句Hive的String类......
  • SpringCloud之Gateway
    1.什么是GatewaySpringCloudGateway是Spring公司基于Spring5.0,SpringBoot2.0和ProjectReactor等术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。它的目标是替代NetflflixZuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了......