Tomcat 启用压缩会导致 OS X High Sierra 出错

Tomcat with compression enabled causes error on OS X High Sierra

我们在 OS X 上使用 Tomcat (v7) 已经有一段时间了,从未遇到过任何问题。但是,将 OS 更新为 High Sierra 后,在 server.xml.

中启用压缩后,Web 应用程序将不再工作

Chrome 不断显示一个 ERR_CONTENT_DECODING_FAILED (显然没有任何内容显示)。关闭压缩后,一切正常。我认为问题的根源是 Apple 在 High Sierra 中对 zlib 的升级。在 Sierra 上一切正常。 Tomcat 日志文件看起来完美无缺 -- 没有提及那里发生的任何错误。

有没有人遇到同样的问题并设法解决它或知道可行的解决方法而不禁用压缩

此外,如果有人可以确认 Tomcat 的较新版本在 High Sierra 上没有遇到此问题,那也会很有帮助。

感谢您的帮助。

找到实际修复之前的解决方法:在您的 tomcat 项目的 server.xml 配置中关闭压缩。

这是 Java SDK setLevel() 方法实现方式中的错误。据悉,设置级别后的压缩数据会被SDK丢弃。这将导致压缩数据损坏。错误的修复可以找到 here,由 xuemingshen 编写。

Workarround/Hack for Windows: 不幸的是我不熟悉 OS X,但我在 Windows 上遇到了同样的问题并且能够找到一个有点肮脏的解决方案。 deflate.c 错误已在 8u162-ea 中修复,请参阅 https://bugs.openjdk.java.net/browse/JDK-8189789

不幸的是,8u162-ea 可能不包含所有修复,或者对于生产环境可能不够好。

要在 8u152 下修复它,请从 http://jdk.java.net/8/

下载并安装最新更新

转到安装文件夹(例如 C:\Java\jdk8-162-ea\jre\bin\)并复制包含修复程序的 zip.dll(请参阅 JDK 9 deflate.c fix)并将其粘贴到 [= 下的同一位置15=].

希望你能在OSX下找到类似的东西。

Fyi,OS X 用户,我尝试从 http://jdk.java.net/8/ 安装 JDK 8u162-ea,但没有解决问题。我认为原因是,与 Windows JDK 不同,OS X JDK 不捆绑 zlib,而是使用 [=23= 中包含的 zlib ] X (/usr/lib/libz.1.dylib)。这可以通过查看 java 可执行文件所依赖的共享库来看出:

$ otool -L /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java:
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
    /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 55179.0.2)
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 45.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.1.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.11.0)

所以我认为我们需要 Apple 以 High Sierra 更新。

我们针对本地开发人员的解决方法:我们使用 spring 引导并有一个 EmbeddedServletContainerCustomizer。更新到 High Sierra 后,同样的问题。该问题仅存在于本地开发中,因此无法推向生产。如上所述,我们在 MainConfiguration 中关闭了压缩,如下所示:

    @Bean
    public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainerFactory servletContainer) {
            ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers(
                    new TomcatConnectorCustomizer() {
                        @Override
                        public void customize(Connector connector) {
                            AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
                            httpProtocol.setCompression("off");
                            httpProtocol.setCompressionMinSize(256);
                            String mimeTypes = httpProtocol.getCompressableMimeTypes();
                            mimeTypes += "," + MediaType.APPLICATION_JSON_VALUE;
                            mimeTypes += "," + "text/css";
                            mimeTypes += "," + "application/javascript";
                            httpProtocol.setCompressableMimeTypes(mimeTypes);
                        }
                    });
        };
    };
}