【问题标题】:How to do GZIP compression while writing directly to response如何在直接写入响应时进行 GZIP 压缩
【发布时间】:2018-07-02 11:02:03
【问题描述】:

当请求标头在 Accept-Encoding 中包含 gzip 时,我正在尝试压缩我的响应。但是,只有在控制器方法返回一个对象时,才能在 app.properties 中添加以下内容。

server.compression.enabled=true
server.compression.min-response-size=1
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css

我正在直接写入响应流。因此,上述压缩属性不起作用。

我的方法是这样的:

@GetMapping(path = "/something", produces = MediaType.TEXT_PLAIN_VALUE)
public void getSomething(@RequestParam(name = "paramA") String paramA,
                            HttpServletRequest request,
                                  HttpServletResponse response) throws IOException {
            PrintWriter writer = null;
    if (request.getHeader("Accept-Encoding").contains("gzip")) {
        writer = new PrintWriter(new OutputStreamWriter(new GZIPOutputStream(response.getOutputStream())));
        response.addHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
    } else {
        writer = response.getWriter();
    }

    final PrintWriter fwriter = writer;
    someObjectInstance.getSomething(paramA).forEach(x -> {
        fwriter.write(x.toString());
    });
    fwriter.flush();
}

当我 curl 上述方法时,我得到一个空文件。 我确实通过参考以下链接尝试使用 GzipFilter。 http://www.javablog.fr/javaweb-gzip-compression-protocol-http-filter-gzipresponsewrapper-gzipresponsewrapper.html,顺便说一句。 但是,过滤器需要大量样板代码。有没有办法可以更改控制器方法并解决上述链接中的问题。

【问题讨论】:

    标签: spring-mvc gzip httpresponse gzipstream gzipoutputstream


    【解决方案1】:

    刚刚意识到我没有关闭作者。 添加后 fwriter.close();最后,问题解决了。

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多