使用Spring Boot/MVC/JavaConfig与RESTful一起使用GZIP压缩

5 浏览
0 Comments

使用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的配置。

0
0 Comments

问题的原因是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压缩。

0
0 Comments

问题的出现原因是因为需要在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压缩,以提高效率和易用性。

对于其他问题和建议,请参考相关的文档和讨论。

0
0 Comments

最近在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压缩了。

0