如何在直接写入响应时进行 GZIP 压缩
How to do GZIP compression while writing directly to response
当请求 header 在 Accept-Encoding 中包含 gzip 时,我正在尝试压缩我的响应。但是,仅当控制器方法返回 object.
时,将以下内容添加到 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();
}
当我用上述方法卷曲时,我得到一个空文件。
我确实通过参考以下link尝试使用GzipFilter。
http://www.javablog.fr/javaweb-gzip-compression-protocol-http-filter-gzipresponsewrapper-gzipresponsewrapper.html,顺便说一句。
但是,过滤器需要大量样板代码。有没有一种方法可以更改控制器方法并解决上述 link 中的问题。
刚刚意识到我没有关闭作者。
添加 fwriter.close() 后;最后,问题解决了。
当请求 header 在 Accept-Encoding 中包含 gzip 时,我正在尝试压缩我的响应。但是,仅当控制器方法返回 object.
时,将以下内容添加到 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();
}
当我用上述方法卷曲时,我得到一个空文件。 我确实通过参考以下link尝试使用GzipFilter。 http://www.javablog.fr/javaweb-gzip-compression-protocol-http-filter-gzipresponsewrapper-gzipresponsewrapper.html,顺便说一句。 但是,过滤器需要大量样板代码。有没有一种方法可以更改控制器方法并解决上述 link 中的问题。
刚刚意识到我没有关闭作者。 添加 fwriter.close() 后;最后,问题解决了。