SpringBoot中开启GZIP压缩的方法

在Spring Boot中开启GZIP压缩可以显著减少HTTP响应的大小,从而提高网页加载速度和用户体验。Spring Boot提供了多种方式来启用GZIP压缩,以下是几种常用的方法:

图片[1]_SpringBoot中开启GZIP压缩的方法_知途无界

方法一:通过application.propertiesapplication.yml配置

Spring Boot通过spring-boot-starter-web模块内置了对GZIP压缩的支持,你可以通过配置文件来启用。

1. 使用application.properties

# 启用HTTP响应压缩
server.compression.enabled=true

# 设置压缩的MIME类型(默认是text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml)
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript

# 设置触发压缩的最小响应大小(默认是2048字节)
server.compression.min-response-size=1024

2. 使用application.yml

server:
  compression:
    enabled: true
    mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
    min-response-size: 1024

方法二:通过Java配置类自定义

如果你需要更细粒度的控制,可以通过Java配置类来定制压缩行为。

import org.springframework.boot.web.server.Compressor;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.filter.ShallowEtagHeaderFilter;

@Configuration
public class WebConfig {

    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer() {
        return factory -> {
            if (factory instanceof TomcatServletWebServerFactory) {
                TomcatServletWebServerFactory tomcatFactory = (TomcatServletWebServerFactory) factory;
                tomcatFactory.addContextCustomizers(context -> {
                    // 这里可以添加更细粒度的Tomcat配置(可选)
                });
            }
            // 启用压缩(Spring Boot 2.3+ 可直接通过属性配置,此处为手动示例)
            // 实际上,Spring Boot 2.3+ 已内置此功能,通常不需要手动设置
            // 但如果需要自定义,可以通过实现HttpCompressionFilter或类似方式
        };
    }

    // Spring Boot 2.3+ 推荐通过属性配置,以下为更现代方式的示例(通过Filter注册,非必须)
    @Bean
    public ShallowEtagHeaderFilter shallowEtagHeaderFilter() {
        return new ShallowEtagHeaderFilter(); // 可选,结合ETag使用
    }

    // 注意:Spring Boot 2.3+ 默认集成了GZIP压缩,通常不需要手动编写压缩Filter
    // 如果需要自定义Filter,可参考以下方式(不推荐,除非有特殊需求)
    /*
    @Bean
    public FilterRegistrationBean<GzipFilter> gzipFilterRegistration() {
        FilterRegistrationBean<GzipFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new GzipFilter()); // 自定义GzipFilter(需实现javax.servlet.Filter)
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
    */
}

说明

  • Spring Boot 2.3+:推荐通过application.propertiesapplication.yml配置,无需手动编写Java配置。
  • 自定义Filter:如果需要更复杂的逻辑(如动态决定是否压缩),可以实现javax.servlet.Filter接口,但通常不推荐,除非有特殊需求。

方法三:使用第三方库(如GzipFilter

虽然Spring Boot内置了GZIP支持,但在某些情况下,你可能希望使用第三方库来提供更高级的功能。

示例:使用GzipFilter

  1. 添加依赖(如果需要第三方库,如com.googlecode.gzipfilter):
<dependency>
    <groupId>com.googlecode.gzipfilter</groupId>
    <artifactId>gzipfilter-servlet</artifactId>
    <version>1.0.5</version>
</dependency>
  1. 注册Filter
import com.googlecode.gzipfilter.GzipFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GzipConfig {

    @Bean
    public FilterRegistrationBean<GzipFilter> gzipFilterRegistration() {
        FilterRegistrationBean<GzipFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new GzipFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

注意

  • Spring Boot 2.3+ 已经内置了GZIP压缩支持,通常不需要引入第三方库。
  • 第三方库可能提供更多功能,但也会增加项目的复杂性和依赖。

方法四:通过反向代理服务器(如Nginx)实现

如果你的应用部署在反向代理服务器(如Nginx)后面,通常建议在反向代理服务器上启用GZIP压缩,而不是在应用服务器上。

Nginx配置示例

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_min_length 1024;
    }
}

优点

  • 反向代理服务器通常更擅长处理静态资源和压缩,可以减轻应用服务器的负担。
  • 集中管理压缩策略,便于维护和优化。

总结

  • 推荐方式:在Spring Boot 2.3+中,通过application.propertiesapplication.yml配置是最简单、最推荐的方式。
  • 高级需求:如果需要更复杂的压缩逻辑,可以考虑自定义Filter或使用第三方库。
  • 生产环境:在生产环境中,通常建议在反向代理服务器(如Nginx)上启用GZIP压缩,以获得更好的性能和可维护性。

通过以上方法,你可以在Spring Boot应用中轻松启用GZIP压缩,提升应用的性能和用户体验。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞71 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容