Spring Boot 3嵌入式Tomcat如何用Brotli替代GZIP实现动态压缩?
关于Spring Boot 3嵌入式Tomcat启用动态Brotli压缩的解决方案
首先明确:Spring Boot 3.1.x默认的server.compression配置仅支持GZIP,没有直接的Brotli动态压缩开关,但可以通过自定义Tomcat配置实现实时Brotli压缩,无需预编译压缩文件或反向代理。
实现步骤
1. 确认依赖
Spring Boot 3.1.1使用的嵌入式Tomcat版本为10.1.x,该版本已内置Brotli压缩支持,无需额外添加第三方依赖,项目依赖中的tomcat-embed-core(Spring Boot Web Starter默认已包含)即可满足需求。
2. 自定义Tomcat Connector配置
创建配置类,通过TomcatServletWebServerFactory自定义Connector的压缩规则,注册Brotli压缩器并设置其优先级高于GZIP:
import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.http.compress.CompressionConfig; import org.apache.tomcat.util.http.compress.CompressionConfigFactory; import org.apache.tomcat.util.http.compress.CompressionLevel; import org.apache.tomcat.util.http.compress.CompressorFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatBrotliCompressionConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCompressionCustomizer() { return factory -> factory.addConnectorCustomizers((Connector connector) -> { // 启用压缩 connector.setCompression("on"); // 设置触发压缩的最小响应大小(与原配置一致) connector.setCompressionMinSize(4096); // 指定需要压缩的MIME类型(与原配置一致) connector.setCompressableMimeType("text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/font-sfnt,application/font-woff,application/font-woff2"); // 配置Brotli压缩器并设置优先级 CompressionConfig compressionConfig = CompressionConfigFactory.createCompressionConfig(connector); // 添加Brotli压缩器,可选设置压缩级别(DEFAULT/BEST_SPEED/BEST_COMPRESSION) compressionConfig.addCompressor(CompressorFactory.getCompressor("br", CompressionLevel.DEFAULT)); // 让Brotli优先级高于GZIP compressionConfig.setCompressorOrder("br,gzip"); // 将配置绑定到Connector connector.setProperty("compressionConfig", compressionConfig); }); } }
3. 验证效果
启动应用后,通过浏览器开发者工具或curl模拟携带Accept-Encoding: br的请求,查看响应头是否包含Content-Encoding: br,即可确认Brotli动态压缩生效。
关键说明
- 若客户端请求同时支持
br和gzip,Tomcat会优先使用Brotli压缩(因配置了compressorOrder为br,gzip)。 - 可调整
CompressionLevel参数平衡压缩率与性能,BEST_SPEED侧重响应速度,BEST_COMPRESSION侧重压缩比例。 - 该方案完全基于嵌入式Tomcat实现,无需预生成压缩文件或依赖反向代理。
内容的提问来源于stack exchange,提问作者BoRo
相关产品推荐
相关产品推荐

