【问题标题】:Compressing response in Spring Boot controller and inflating in JavaScript在 Spring Boot 控制器中压缩响应并在 JavaScript 中膨胀
【发布时间】:2019-02-12 16:34:29
【问题描述】:

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

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

放气器代码:

    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】:

    Deflater (sic) 正在生成原始的 deflate 数据,然后您将对其进行 Base-64 编码。您的 pako 解码器不是首先解码 Base-64 编码,因此 inflateRaw 得到的是一堆 Base-64 字符,而不是它所期望的原始 deflate 流。

    GZIPOutputStream 正在生成一个 gzip 包装的 deflate 流。 inflateRaw 期待一个原始的 deflate 流,但得到的是一个 gzip 标头,它不会寻找并解释为无效的 deflate 数据。

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

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

    【讨论】:

    • 感谢您的帮助。我们回到了服务器端的 GZIPOutputStream,但是当我们使用 pako.ungzip 时,我们得到错误:'incorrect header check'。
    猜你喜欢
    • 2021-04-23
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2014-07-25
    • 1970-01-01
    • 2016-11-20
    • 2017-12-12
    相关资源
    最近更新 更多