it-swarm.com.ru

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.

Спасибо за вашу помощь.

13
Emulov

Это ошибка в реализации метода Java SDK setLevel(). Сообщается, что сжатые данные, полученные в результате установки уровня, отбрасываются SDK. Это приведет к повреждению сжатых данных. Исправление для ошибки может быть найдено здесь , написанное xuemingshen.

7
Mark Adler

Обходной путь до тех пор, пока не будет найдено действительное исправление: отключите сжатие в конфигурации server.xml вашего проекта Tomcat.

4
cedric

Обходной путь/взлом для 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.

2
PF.

К вашему сведению, пользователи 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.

0
ips

Наш обходной путь для локального разработчика: мы используем весеннюю загрузку и имеем EmbeddedServletContainerCustomizer. После обновления до Высокой Сьерры та же проблема. Проблема существует только для местного развития, поэтому не нужно что-то подталкивать к производству. Как упоминалось выше, мы отключили сжатие в нашей 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
ssoward