Tomcat с включенным сжатием вызывает ошибку в OS X High Sierra
Мы использовали Tomcat (v7) на OS X уже довольно давно и никогда не испытывали никаких проблем. Однако после обновления ОС до High Sierra веб-приложения больше не работают, когда сжатие включено в файле server.xml.
Chrome постоянно показывает ERR_CONTENT_DECODING_FAILED (очевидно, без отображения содержимого). Когда компрессия отключена, все работает нормально. Я предполагаю, что корень проблемы - обновление Apple zlib в High Sierra. В Сьерра все отлично работало. Файлы журнала Tomcat выглядят безупречно - здесь не упоминается какая-либо ошибка.
Кто-нибудь испытывает ту же проблему и сумел ее исправить или знает о жизнеспособном обходном пути без отключения сжатия?
Кроме того, было бы полезно, если кто-то может подтвердить, что более новые версии Tomcat не испытывают этой проблемы в High Sierra.
Спасибо за вашу помощь.
Ответы
Ответ 1
Это ошибка в реализации метода Java SDK setLevel()
. Сообщается, что сжатые данные, возникающие в результате установки уровня, отбрасываются SDK. Это приведет к повреждению сжатых данных. Исправление ошибки можно найти здесь, написанной xuemingshen.
Ответ 2
Обходной путь до фактического исправления найден для этого: отключите сжатие в конфигурации проекта tomcat server.xml
.
Ответ 3
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) и вставьте его в том же месте под jdk 8u152
.
Надеюсь, вы сможете найти что-то подобное под OS X.
Ответ 4
Пользователи Fyi, OS X, я попытался установить JDK 8u162-ea из http://jdk.java.net/8/, и это не устранило проблему. Я думаю, причина в том, что, в отличие от Windows JDK, OS X JDK не связывает zlib, а использует zlib, который включен в OS 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.
Ответ 5
Наш обходной путь для локального dev: мы используем boot 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);
}
});
};
};
}