Java 启用压缩的Tomcat在OS X High上导致错误
我们在OSX上使用Tomcat(v7)已经有一段时间了,从未遇到过任何问题。但是,在将操作系统更新为High Sierra之后,如果在server.xml中启用了压缩,则web应用程序将不再工作 Chrome不断显示错误内容解码失败(显然没有任何内容显示)。关闭压缩后,一切正常。我认为问题的根源在于苹果在High Sierra升级了zlib。塞拉的一切都很顺利。Tomcat日志文件看起来完美无缺——这里没有提到任何错误 是否有人遇到过同样的问题并设法解决了它,或者知道一种可行的解决方法而不禁用压缩 另外,如果有人能确认Tomcat的新版本在高性能上没有遇到这个问题,这也会很有帮助Java 启用压缩的Tomcat在OS X High上导致错误,java,macos,tomcat,compression,zlib,Java,Macos,Tomcat,Compression,Zlib,我们在OSX上使用Tomcat(v7)已经有一段时间了,从未遇到过任何问题。但是,在将操作系统更新为High Sierra之后,如果在server.xml中启用了压缩,则web应用程序将不再工作 Chrome不断显示错误内容解码失败(显然没有任何内容显示)。关闭压缩后,一切正常。我认为问题的根源在于苹果在High Sierra升级了zlib。塞拉的一切都很顺利。Tomcat日志文件看起来完美无缺——这里没有提到任何错误 是否有人遇到过同样的问题并设法解决了它,或者知道一种可行的解决方法而不禁用压
感谢您的帮助。在找到实际修复方法之前的变通方法:关闭tomcat项目的
server.xml
配置中的压缩。这是Java SDKsetLevel()
方法实现中的一个错误。据报道,SDK丢弃了设置级别所产生的压缩数据。这将导致压缩数据损坏。该漏洞的修复程序可以找到,由薛明申编写。Workaround/Hack for Windows:不幸的是,我不熟悉OS X,但我在Windows上也面临同样的问题,并且能够找到一个有点脏的解决方案。已在8u162 ea
中修复了deflate.c错误,请参阅
不幸的是,8u162 ea
可能不包含所有修复程序,或者对于生产环境来说可能不够好
要在8u152
下修复它,请从下载并安装最新更新
转到安装文件夹(例如C:\Java\jdk8-162-ea\jre\bin\
),复制包含修复程序的zip.dll
(请参阅),并将其粘贴到jdk 8u152
下的同一位置
我希望你能在OS X下找到类似的东西。仅供参考,OS X用户,我尝试从安装JDK 8u162 ea,但它没有解决问题。我认为原因是,与WindowsJDK不同,OSXJDK不捆绑zlib,而是使用OSX附带的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的更新。我们针对本地开发人员的解决方案:我们使用spring boot,并有一个嵌入式ServletContainerCustomizer。更新至High Sierra后,同一问题。这个问题只存在于当地的发展中,因此不能推动生产。如上所述,我们在主配置中关闭了压缩,如下所示:
@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);
}
});
};
};
}
谢谢,但如果你仔细阅读我的问题,它说我正在寻找一个不禁用压缩的修复/解决方案。我找不到解决方案。必须关闭server.xml中的压缩。请发布您找到的任何解决方案。如果gzip在终端上停止工作,则会出现其他问题。用自制安装的gzip v1.8(/usr/local/ceral/gzip/1.8)替换/sw/bin/gzip解决了这个问题。对我来说,Tomcat的压缩问题仅限于js和css文件。Html仍在呈现中。如果错误在JDK中,为什么它在以前版本的OS X中工作?我仍然认为这是一个与zlib相关的bug,因为苹果在High Sierra进行了重大升级。。。在任何情况下:哪些版本的JDK会受到您所说的bug的影响?据我所知,它会影响所有版本的JDK,直到修复程序实现为止。zlib在其规范内改变了其行为,暴露了JDK中的错误。JDK不能正确处理来自zlib函数的返回代码,丢弃了该函数可能返回的数据,现在在这个应用程序中,该函数确实返回了这些数据。这不是zlib中的bug。谢谢,我现在明白了,你写的东西很有意义。我真的希望JDK bug很快得到修复。在那之前,我想我必须关闭Tomcat服务器上的压缩。这似乎是JDK的潜在缺陷:如果您转到并在页面上找到“zlib”,您将看到,即使是最新的Oracle JDK 8也尚未对此进行修复(从1.8u152开始)。我想说的是,请继续关注该文档,寻找一个已经修复的版本。不,JDK需要修复。如果这个bug在JDK中被修复,那么它将在High Sierra中与zlib一起工作。但是,他说JDK bug是在JDK 8u151中引入的,但我在JDK 8u144中遇到了这个问题。我是在升级到High Sierra之后开始体验的,而不是在升级我的JDK之后。据我所知,JDK中的bug从一开始就存在。正是zlib的新版本激发了这个bug。