压缩Spring Boot控制器中的响应并在JavaScript中进行扩充

问题描述 投票:0回答:1

我们尝试在服务器端使用Deflater输出流和GZIP输出流来压缩响应,并在客户端使用Pako模块对其进行解压缩。使用deflater会在浏览器中给出控制台错误“未捕获的异常:无效距离太远”,并使用gzip给出“未捕获的异常:无效的块类型”。

根据我的阅读,浏览器应该能够解压缩响应本身,但使用“response.addHeader(”Content-Encoding“,”gzip“);”不起作用。没有错误,当浏览器收到响应时,响应只是没有那个标题。

deflater代码:

    private static String compress(String str)
    {
        try
        {
            final ByteArrayOutputStream out = new ByteArrayOutputStream();
            try
            {
                final DeflaterOutputStream def = new DeflaterOutputStream(out, new Deflater(Deflater.BEST_COMPRESSION, true));
                try
                {
                    def.write(str.getBytes());                    
                    return new String(Base64.encodeBase64(out.toByteArray()));
                }
                finally
                {def.close();}
            }
            finally
            {out.close();}
        }
        catch(IOException e)
        {
            LOGGER.warn("Failed to compress.");
        }
  return str;

Gzip代码。

    try
    {
        final ByteArrayOutputStream out = new ByteArrayOutputStream();

        try
        {    
            final GZIPOutputStream gzip = new GZIPOutputStream(out);
            try
            {gzip.write(str.getBytes());}
            finally
            {gzip.close();}

            return out.toString("UTF-8");
        }
        finally
        {out.close();}
    }
    catch(IOException e)
    {LOGGER.warn("Failed to compress.");}

    return str;
}

pako电话

LandAdditions.prototype.loadfields = function() {
    let me = this;

    me.loadingBanner().show();

    var url =
    "/rest/accounts/" + app.accountIdBox().val() + "/land_additions/fields";

  $.get(url)
    .done(function(data) {
      me.onLoadFields(JSON.parse(pako.inflateRaw(data, { to: 'string'})));
node.js spring-boot compression deflate
1个回答
0
投票

Deflater(sic)正在生成原始的deflate数据,然后你就是Base-64编码。你的pako解码器不首先解码Base-64编码,所以inflateRaw得到了一堆Base-64字符,而不是它所期望的原始deflate流。

GZIPOutputStream正在生成一个包含gzip的deflate流。 inflateRaw期待一个原始的deflate流,但是它正在获取一个gzip头,它没有寻找并解释为无效的deflate数据。

对于第一个,您需要解码Base-64。对于第二个,你需要解码gakip数据,其中pako有ungzip。

顺便说一句,您不希望将二进制数据编码为UTF-8。 UTF-8不能代表所有二进制序列。

© www.soinside.com 2019 - 2024. All rights reserved.