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