You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:28:33