我们将springboot/mvc与基于注解的java配置一起用于一系列restful服务,并希望在一些api响应上有选择地启用httpgzip流压缩。
我知道我可以在我的控制器和 byte[] @ResponseBody
但是,我们更愿意依赖springmvc基础设施(filters/etc),让它自动执行json转换和压缩(即,该方法返回一个pojo)。
如何在responsebody或嵌入的tomcat示例中启用gzip压缩,并且在某种程度上我们只能有选择地压缩一些响应?
我们目前没有任何基于xml的配置。
8条答案
按热度按时间nhjlsmyf1#
要启用gzip压缩,需要修改嵌入式tomcat示例的配置。为此,您需要声明
EmbeddedServletContainerCustomizer
bean,然后注册TomcatConnectorCustomizer
用它。例如:
有关可用的各种压缩配置选项的更多详细信息,请参阅tomcat文档。
你说你想有选择地启用压缩。根据您的选择标准,上述方法可能就足够了。它使您能够通过请求的用户代理、响应的大小和响应的mime类型来控制压缩。
如果这不能满足您的需要,那么我相信您必须在控制器中执行压缩,并返回带有gzip内容编码头的byte[]响应。
yjghlzjz2#
在tomcat中启用gzip在我的spring boot项目中不起作用。我用了这里的压缩过滤器。
lfapxunr3#
其余的答案已经过时和/或过于复杂,因为imo应该很简单(gzip已经存在多久了?比java长……)从文档:
在application.properties 1.3中+
应用属性1.2.2-<1.3
早于1.2.2:
另请注意,只有在运行embedded tomcat时,这才起作用:
如果计划部署到非嵌入式tomcat,则必须在server.xml中启用它http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#standard_implementation
irl生产说明:
为了避免所有这些问题,考虑在tomcat前面使用一个带有nginx和/或haproxy或类似工具的代理/负载平衡器设置,因为它将比java/tomcat的线程模型更高效、更容易地处理静态资产和gzip。
你不想把“猫”扔进浴缸,因为它忙于压缩东西,而不是提供请求(或者更可能是在运行aws账单的时候旋转线程/消耗cpu/堆,坐在那里等待数据库io的发生,这就是为什么传统的java/tomcat可能不是一个好主意,这取决于你在做什么但我离题了……)
参考文献:https://docs.spring.io/spring-boot/docs/current-snapshot/reference/html/howto.html#how-启用http响应压缩
https://github.com/spring-projects/spring-boot/issues/2031
mhd8tkvw4#
论新版本
application.yml
配置:yduiuuwa5#
为此,我添加了:
服务器压缩
取自http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
o2rvlv0m6#
这与@andy wilkinson提供的解决方案基本相同,但从springboot1.0开始,customize(…)方法有一个configurablembeddedservletcontainer参数。
另一件值得一提的事情是tomcat只压缩
text/html
,text/xml
以及text/plain
默认情况下。下面是一个支持压缩application/json
也:smtd7mpg7#
springboot1.4将其用于javascript html json所有压缩。
cuxqih218#
我的spring boot+spring数据项目在调用
@RepositoryRestResource
.问题是返回的mime类型;哪个是
application/hal+json
. 将其添加到server.compression.mime-types
物业为我解决了这个问题。希望这对别人有帮助!