使用带有RESTful的Spring Boot/MVC/JavaConfig进行GZIP压缩

 一达通治蓬_832 发布于 2023-01-30 18:55

我们将Spring Boot/MVC与基于注释的java-config一起用于一系列RESTful服务,我们希望有选择地HTTP GZIP在某些API响应上启用流压缩.

我知道我可以在我的控制器中手动执行此操作byte[] @ResponseBody,但是我们更愿意依赖SpringMVC基础结构(过滤器/等)并让它自动执行JSON转换和压缩(即该方法返回POJO).

如何在ResponseBody或嵌入式Tomcat实例中启用GZIP压缩,并且我们可以选择性地仅压缩某些响应?

谢谢!

PS.:我们目前没有任何基于XML的配置.

6 个回答
  • 这些答案的其余部分已经过时和/或顶部复杂的东西应该是简单的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时,这才会起作用:

    如果您计划部署到非嵌入式tomcat,则必须在server.xml中启用它http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation

    IRL生产注意事项:

    另外,为了避免所有这些,请考虑在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

    2023-01-30 18:55 回答
  • 我为此添加了:

    服务器压缩

    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/

    2023-01-30 18:57 回答
  • 这与@ andy-wilkinson提供的解决方案基本相同,但从Spring Boot 1.0开始,customize(...)方法具有ConfigurableEmbeddedServletContainer参数.

    这是值得一提的另一件事是,Tomcat的只有压缩的内容类型text/html,text/xmltext/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);
                            }
                        }
                );
            }
        };
    }
    

    2023-01-30 18:57 回答
  • 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
    

    2023-01-30 18:57 回答
  • 在Tomcat中启用GZip在我的Spring Boot项目中不起作用。我使用了在这里找到的CompressingFilter。

    @Bean
    public Filter compressingFilter() {
        CompressingFilter compressingFilter = new CompressingFilter();
        return compressingFilter;
    }
    

    2023-01-30 18:58 回答
  • application.yml配置中的最新版本:

    ---
    
    spring:
      profiles: dev
    
    server:
      compression:
        enabled: true
        mime-types: text/html,text/css,application/javascript,application/json
    
    ---
    

    2023-01-30 18:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有