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

时间:2017-10-03 07:38:24

标签: java macos tomcat compression zlib

我们已经在OS X上使用Tomcat(v7)已经有一段时间了,并且从未遇到过任何问题。但是,在将操作系统更新到High Sierra之后,当在server.xml中启用压缩时,Web应用程序将不再起作用。

Chrome会不断显示ERR_CONTENT_DECODING_FAILED(显然没有任何内容显示)。当压缩关闭时,一切正常。我认为问题的根源是Apple在High Sierra中对zlib的升级。塞拉利昂的一切都运转良好。 Tomcat日志文件看起来完美无瑕 - 没有提到任何错误。

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

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

感谢您的帮助。

5 个答案:

答案 0 :(得分:7)

这是Java SDK setLevel()方法实现方式的错误。据报道,SDK放弃了因设置级别而产生的压缩数据。这将导致压缩数据损坏。可以找到该错误的修复程序here,由xuemingshen编写。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

适用于Windows的Workarround / Hack:不幸的是我不熟悉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)并将其粘贴到jdk 8u152下的同一位置}。

我希望你能在OS X下找到类似的东西。

答案 3 :(得分:0)

Fyi,OS X用户,我尝试从http://jdk.java.net/8/安装JDK 8u162-ea,但它没有解决问题。我认为原因在于,与Windows JDK不同,OS X JDK不捆绑zlib,而是使用OS X中包含的zlib(/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。

答案 4 :(得分:0)

我们对本地开发人员的解决方法:我们使用spring boot并拥有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);
                        }
                    });
        };
    };
}