我们将Spring Boot/MVC与基于注释的java-config一起用于一系列RESTful
服务,我们希望有选择地HTTP GZIP
在某些API响应上启用流压缩.
我知道我可以在我的控制器中手动执行此操作byte[] @ResponseBody
,但是我们更愿意依赖SpringMVC基础结构(过滤器/等)并让它自动执行JSON转换和压缩(即该方法返回POJO).
如何在ResponseBody或嵌入式Tomcat实例中启用GZIP压缩,并且我们可以选择性地仅压缩某些响应?
谢谢!
PS.:我们目前没有任何基于XML的配置.
这些答案的其余部分已经过时和/或顶部复杂的东西应该是简单的IMO(gzip现在已经存在了多长时间?比Java更长......)来自文档:
在application.properties 1.3+中
# ??? server.compression.enabled=true # opt in to content types server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css # not worth the CPU cycles at some point, probably server.compression.min-response-size=10240
在application.properties 1.2.2 - <1.3
server.tomcat.compression=on server.tomcat.compressableMimeTypes=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
年龄超过1.2.2:
@Component public class TomcatCustomizer implements TomcatConnectorCustomizer { @Override public void customize(Connector connector) { connector.setProperty("compression", "on"); // Add json and xml mime types, as they're not in the mimetype list by default connector.setProperty("compressableMimeType", "text/html,text/xml,text/plain,application/json,application/xml"); } }
如果您计划部署到非嵌入式tomcat,则必须在server.xml中启用它http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation
另外,为了避免所有这些,请考虑在Tomcat前面使用nginx和/或haproxy或类似设置代理/负载均衡器,因为它将比Java/Tomcat的线程模型更有效,更轻松地处理静态资产和gzip MUCH.
你不想把'cat in the bath因为它正在忙于压缩东西而不是提供请求(或者更可能是在启动你的AWS账单时,在等待数据库IO发生时旋转线程/吃CPU /堆)为什么传统的Java/Tomcat可能不是一个好主意,取决于你在做什么,但我离题...)
refs:https: //docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto.html#how-to-enable-http-response-compression
https://github.com/spring-projects/spring-boot/issues/2031
我为此添加了:
server.compression.enabled=true server.compression.min-response-size=2048 server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
取自http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
这与@ andy-wilkinson提供的解决方案基本相同,但从Spring Boot 1.0开始,customize(...)方法具有ConfigurableEmbeddedServletContainer参数.
这是值得一提的另一件事是,Tomcat的只有压缩的内容类型text/html
,text/xml
并text/plain
在默认情况下.下面是一个支持压缩的示例application/json
:
@Bean public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer servletContainer) { ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers( new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler(); httpProtocol.setCompression("on"); httpProtocol.setCompressionMinSize(256); String mimeTypes = httpProtocol.getCompressableMimeTypes(); String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE; httpProtocol.setCompressableMimeTypes(mimeTypesWithJson); } } ); } }; }
Spring Boot 1.4用于Javascript HTML Json所有压缩.
server.compression.enabled: true server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
在Tomcat中启用GZip在我的Spring Boot项目中不起作用。我使用了在这里找到的CompressingFilter。
@Bean public Filter compressingFilter() { CompressingFilter compressingFilter = new CompressingFilter(); return compressingFilter; }
在application.yml
配置中的最新版本:
--- spring: profiles: dev server: compression: enabled: true mime-types: text/html,text/css,application/javascript,application/json ---