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

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

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

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

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

谢谢你的帮助。

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

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

适用于Windows的Workarround / Hack:不幸的是我不熟悉OS X,但我在Windows上遇到了同样的问题,并且能够找到一些有点脏的解决方案。 deflate.c错误已在8u162-ea8u162-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修复 )并将其粘贴到同一位置在jdk 8u152

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

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) 

所以我认为我们需要通过更新High Sierra的方式解决Apple的这个问题。

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