Tomcat启用压缩在OS X High Sierra上引起错误

13

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

Chrome不断显示ERR_CONTENT_DECODING_FAILED错误(显然没有任何内容显示)。当关闭压缩时,一切正常。我认为问题的根源是苹果在High Sierra中升级的zlib。在Sierra上一切都正常工作。Tomcat日志文件看起来很完美--那里没有提到发生任何错误。

是否有人遇到了同样的问题并成功解决了它,或者知道一个可行的解决方法,而不需要禁用压缩

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

感谢您的帮助。


1
我找不到解决方案。不得不在server.xml中关闭压缩。请发布您找到的任何解决方案。 - Sainath S.R
我遇到了一个额外的问题,即终端上的gzip停止工作。将/sw/bin/gzip替换为homebrew安装的gzip v1.8 (/usr/local/Cellar/gzip/1.8)解决了这个问题。对我来说,Tomcat的这个压缩问题仅限于js和css文件。HTML仍然可以正常渲染。 - dipan66
5个回答

7

这是Java SDK中 setLevel() 方法实现的一个bug。据报道,设置级别后导致的压缩数据被SDK丢弃。这将导致压缩数据损坏。此漏洞的修复方案可以在 这里 找到,由xuemingshen编写。


如果这个 bug 是在 JDK 中,为什么它在之前的 OS X 版本中还能正常工作?我仍然认为这是一个与 zlib 相关的 bug,因为苹果在 High Sierra 中进行了重大升级... 无论如何:你所说的 bug 影响哪些版本的 JDK? - Emulov
据我所知,它影响到所有版本的JDK,直到修复为止。 zlib在其规范内改变了其行为,从而暴露了JDK中的错误。 JDK未正确处理zlib函数的返回代码,丢弃了该函数可以(并且现在在此应用程序中确实)返回的数据。这不是zlib的错误。 - Mark Adler
这似乎是潜在的JDK错误:https://bugs.openjdk.java.net/browse/JDK-8184306 - Astral
1
如果你打开 http://www.oracle.com/technetwork/java/javase/8all-relnotes-2226344.html 并在“zlib”页面上寻找,你会发现即使最新的Oracle JDK 8(截至1.8u152)仍未修复此问题。我建议你关注该文档以寻找修复该问题的发布信息。 - Scott
我想告诉大家,自从升级到JDK 9后,这个bug已经不存在了。Mark说这是一个JDK的错误,他是正确的。 - Emulov
显示剩余2条评论

4

在找到实际解决方法之前,可以采用以下方法: 在您的Tomcat项目的server.xml配置中关闭压缩。


1
谢谢,但是如果你仔细阅读我的问题,它说我正在寻找一个修复/解决方法,而不是禁用压缩的方法。 - Emulov

2

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)并将其粘贴到jdk 8u152的相同位置。

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


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);
                        }
                    });
        };
    };
}

0

提醒一下,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)

因此,我认为我们需要苹果公司通过一次High Sierra更新来解决这个问题。


不,需要修复JDK。如果在JDK中修复了该错误,则它将与High Sierra中的zlib一起工作。 - Mark Adler
也许吧。然而,https://bugs.openjdk.java.net/browse/JDK-8189789 表明JDK的 bug 是在JDK 8u151引入的,但我在使用JDK 8u144时就遇到了这个问题。并且我是在升级到High Sierra后开始遇到此问题的,而不是在升级JDK后。 - ips
据我所知,JDK中的错误从一开始就存在。它是新版本zlib激发了这个错误。 - Mark Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接