Bootstrap

用pako.js压缩字符串,如何在后端用java解开?

背景:项目链路为腾讯clb->Ingress(nginx)->项目服务,腾讯的Ingress对header请求头最大值为256K,无法加大,由于业务配置数据增加,此问题诟病已久,于是想着压缩打请求头数据后再请求,从而解决请求头大的问题

前端为vue项目

注意:pako的版本必须为1.0.3,否则后端解不开,应该是大于此版本pako做过代码调整,并不兼容历史版本(不要问怎么知道的,我都不知道解了多少,一直提示不是gzip格式,我让前端反解析,前端发现也解不出来,后续我发现是版本问题,坑!)

代码

if (config.data?.headerContentUse) {
                config.headers['Content-Encoding'] = 'gzip'
                if (ls.get('oldDetailData')) {
                    let gzip = pako.gzip(encodeURIComponent(JSON.stringify(ls.get('oldDetailData'))), { to: "string" });
                    const base64 = btoa(gzip);
                    config.headers['oldContent'] = base64
                }
                let gzip2 = pako.gzip(encodeURIComponent(JSON.stringify(data)), { to: "string" });
                const base642 = btoa(gzip2);
                config.headers['newContent'] = base642

            }

后端为java项目

代码

          if(StringUtils.isNotBlank(oldContent)){
                    oldContent = this.unZip(oldContent);
                }
                if(StringUtils.isNotBlank(newContent)){
                    newContent = this.unZip(newContent);
                }
    public String unZip(String content) throws IOException {
        byte[] gzipBytes = Base64.getDecoder().decode(content);
        // 使用GZIPInputStream解压缩
        ByteArrayInputStream bais = new ByteArrayInputStream(gzipBytes);
        GZIPInputStream gzis = new GZIPInputStream(bais);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer = new byte[1024];
        int len;
        while ((len = gzis.read(buffer)) > 0) {
            baos.write(buffer, 0, len);
        }
        gzis.close();
        baos.close();
        // 解码URL编码
        return URLDecoder.decode(baos.toString(), "UTF-8");
    }

;