use*_*614 86 java rest gzip spring-mvc spring-java-config
我们将Spring Boot/MVC与基于注释的java-config一起用于一系列RESTful服务,我们希望有选择地HTTP GZIP在某些API响应上启用流压缩.
我知道我可以在我的控制器中手动执行此操作byte[] @ResponseBody,但是我们更愿意依赖SpringMVC基础结构(过滤器/等)并让它自动执行JSON转换和压缩(即该方法返回POJO).
如何在ResponseBody或嵌入式Tomcat实例中启用GZIP压缩,并且我们可以选择性地仅压缩某些响应?
谢谢!
PS.:我们目前没有任何基于XML的配置.
Joh*_*ner 176
这些答案的其余部分已经过时和/或顶部复杂的东西应该是简单的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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
年龄超过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");
}
}
Run Code Online (Sandbox Code Playgroud)
如果您计划部署到非嵌入式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
mat*_*sev 12
这与@ 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);
}
}
);
}
};
}
Run Code Online (Sandbox Code Playgroud)
M. *_*loo 11
在application.yml配置中的最新版本:
---
spring:
profiles: dev
server:
compression:
enabled: true
mime-types: text/html,text/css,application/javascript,application/json
---
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我为此添加了:
server.compression.enabled=true
server.compression.min-response-size=2048
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
Run Code Online (Sandbox Code Playgroud)
取自http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
开启GZIP压缩需要修改内嵌Tomcat实例的配置。为此,您EmbeddedServletContainerCustomizer在 Java 配置中声明了一个bean,然后TomcatConnectorCustomizer用它注册了一个bean 。
例如:
@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainerFactory factory) {
((TomcatEmbeddedServletContainerFactory) factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
httpProtocol.setCompression("on");
httpProtocol.setCompressionMinSize(64);
}
});
}
};
}
Run Code Online (Sandbox Code Playgroud)
有关可用的各种压缩配置选项的更多详细信息,请参阅Tomcat 文档。
你说你想有选择地启用压缩。根据您的选择标准,上述方法可能就足够了。它使您能够通过请求的用户代理、响应的大小和响应的 MIME 类型来控制压缩。
如果这不能满足您的需求,那么我相信您将不得不在控制器中执行压缩并返回一个带有 gzip 内容编码标头的 byte[] 响应。
在Tomcat中启用GZip在我的Spring Boot项目中不起作用。我使用了在这里找到的CompressingFilter。
@Bean
public Filter compressingFilter() {
CompressingFilter compressingFilter = new CompressingFilter();
return compressingFilter;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
88559 次 |
| 最近记录: |