使用Spring Boot/MVC/JavaConfig与RESTful一起使用GZIP压缩
使用Spring Boot/MVC/JavaConfig与RESTful一起使用GZIP压缩
我们使用基于注解的java-config的Spring Boot/MVC来构建一系列的RESTful服务,并且我们希望能够选择性地在一些API响应中启用HTTP GZIP流压缩。
我知道我可以在我的控制器和byte[] @ResponseBody
中手动实现这个功能,然而我们更希望依赖于Spring MVC基础设施(过滤器等)并且让它自动进行JSON转换和压缩(即方法返回一个POJO对象)。
我应该如何在ResponseBody或嵌入的Tomcat实例中启用GZIP压缩,并且以一种可以选择性地压缩只有一些响应的方式进行配置?
我们目前没有任何基于XML的配置。
问题的原因是Spring Boot默认只对"text/html"、"text/xml"和"text/plain"三种内容类型进行压缩,如果要对"application/json"进行压缩需要进行额外的配置。解决方法是在Java配置文件中添加对"application/json"的压缩设置。具体代码如下:
public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { public void customize(ConfigurableEmbeddedServletContainer servletContainer) { ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers( new TomcatConnectorCustomizer() { 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); } } ); } }; }
如果想要验证是否已经启用了压缩,可以通过在请求头中添加"Accept-Encoding: gzip,deflate"来进行验证,例如使用curl命令:
curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
通过以上配置和验证,可以实现在Spring Boot/MVC/JavaConfig中使用GZIP压缩。
问题的出现原因是因为需要在Spring Boot/MVC/JavaConfig中使用GZIP压缩,但是对于不同版本的Spring Boot,配置方式不同。 解决方法是根据Spring Boot版本在application.properties文件中设置相应的属性来启用GZIP压缩。
对于1.3版本及以上的Spring Boot,可以在application.properties文件中添加以下属性来启用GZIP压缩:
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
server.compression.min-response-size=10240
对于1.2.2版本到1.3版本之间的Spring Boot,可以在application.properties文件中添加以下属性来启用GZIP压缩:
server.tomcat.compression=on server.tomcat.compressableMimeTypes=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
对于1.2.2版本以下的Spring Boot,可以创建一个TomcatCustomizer类来自定义Tomcat Connector,并在customize方法中设置compression和compressableMimeType属性来启用GZIP压缩:
public class TomcatCustomizer implements TomcatConnectorCustomizer { public void customize(Connector connector) { connector.setProperty("compression", "on"); connector.setProperty("compressableMimeType", "text/html,text/xml,text/plain,application/json,application/xml"); } }
需要注意的是,这些配置只适用于运行在嵌入式Tomcat中的Spring Boot应用程序。如果要部署到非嵌入式Tomcat中,则需要在server.xml文件中启用GZIP压缩。
在实际生产环境中,考虑使用代理/负载均衡器(如nginx和haproxy)来处理静态资源和gzip压缩,以提高效率和易用性。
对于其他问题和建议,请参考相关的文档和讨论。
最近在application.yml配置文件中,出现了一个问题。在最新版本中,我们发现无法使用通配符mime类型,例如image/*
。这个问题已经被报告并修复了,具体报告和修复情况可以参考github.com/spring-projects/spring-boot/issues/2737。
解决方法是在application.yml配置文件中添加以下内容:
---
spring:
profiles: dev
server:
compression:
enabled: true
mime-types: text/html,text/css,application/javascript,application/json
---
这样,在开发环境中就可以使用GZIP压缩了。