如何在 Spring Boot 中禁用 Tomcat 的 permessage-deflate WebSocket 压缩?

And*_*lis 5 java tomcat websocket spring-boot

我有一个 Spring Boot 服务器,我希望能够与无法或不愿意处理permessage-deflate压缩消息的 websocket 客户端进行通信。我从关于该主题的两个类似问题(下面链接)知道我可以添加 VM 参数-Dorg.apache.tomcat.websocket.DISABLE_BUILTIN_EXTENSIONS=true来禁用 Tomcat 的默认 deflate 压缩。

然而,我计划制作一个程序,以便其他人可以运行它,并且必须强迫人们记住始终包含特定的 VM 参数只是为了更改设置,这似乎相当磨人。

是否有一些替代方法可以禁用 Tomcat 的 websocket 压缩,不需要用户在运行时指定 VM 参数,也许使用 Spring 的 Java 配置或自定义 websocket 握手拦截器?

dan*_*1st 2

您不仅可以使用 JVM 参数设置属性,还可以通过编程方式使用System.setProperty如下内容:

System.setProperty("org.apache.tomcat.websocket.DISABLE_BUILTIN_EXTENSIONS",String.valueOf(true));
Run Code Online (Sandbox Code Playgroud)

如果使用嵌入式 tomcat 将项目导出到 JAR 文件,则可以在main执行之前运行它SpringApplication.run

public static void main(String[] args) {
    System.setProperty("org.apache.tomcat.websocket.DISABLE_BUILTIN_EXTENSIONS",String.valueOf(true));
    SpringApplication.run(YourApplicationClass.class,args);
}
Run Code Online (Sandbox Code Playgroud)

如果您将应用程序打包为 WAR 文件,您可以尝试以下操作:

@SpringBootApplication
public class YourApplicationClass extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        System.setProperty("org.apache.tomcat.websocket.DISABLE_BUILTIN_EXTENSIONS",String.valueOf(true));
        return application.sources(YourApplicationClass.class);
    } 
} 
Run Code Online (Sandbox Code Playgroud)