Сжатие Tomcat не добавляет кодировку содержимого: gzip в заголовке - PullRequest
14 голосов
/ 15 февраля 2009

Я использую Tomcat для сжатия своего HTML-контента следующим образом:

<Connector port="8080" maxHttpHeaderSize="8192"
maxProcessors="150" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="150" connectionTimeout="20000" disableUploadTimeout="true"
compression="on" compressionMinSize="128" noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html"
URIEncoding="UTF-8" />

В HTTP-заголовке (как отмечено через YSlow), однако, я не вижу

Content-Encoding: gzip

, что привело к плохой оценке YSlow.

Все, что я вижу, это

HeadersPost
Response Headers
Server: Apache-Coyote/1.1
Content-Type:   text/html;charset=ISO-8859-1
Content-Language:   en-US
Content-Length: 5251
Date:   Sat, 14 Feb 2009 23:33:51 GMT

Я использую конфигурацию Tomcat apache mod_jk.

Как мне сжать содержимое HTML с помощью Tomcat, а также добавить в заголовок "Content-Encoding: gzip"?

Ответы [ 5 ]

6 голосов
/ 04 марта 2009

Посмотрите на http://sourceforge.net/projects/pjl-comp-filter/.

Другие пользовательские решения могут иметь утечки памяти.

Кроме того, если вы используете mod_jk, то вы, конечно, не используете разъем 8080 (который поддерживает сжатие) для этих запросов.

4 голосов
/ 11 августа 2009

Tomcat будет делать сжатие. Однако, поскольку вы используете mod_jk, я полагаю, вы получаете запросы через Apache через порт 80, а не через tomcat через порт 8080. В качестве эксперимента попробуйте получить вашу страницу через порт 8080, а затем проверить yslow, вы должны увидеть правильные заголовки.

Я думаю, что происходит то, что apache распаковывает контент, который получает с tomcat через mod_jk, а затем передает дефлированный контент в браузер.

Если вы хотите использовать mod_jk, вам нужно настроить сжатие на Apache, а не Tomcat.

2 голосов
/ 15 февраля 2009

Может быть, сжатие, которое имеет в виду Tomcat, не gzip? Это удар в темноте, но он может относиться к сжатию пробелов или обрезке строк.

Я бы предположил, что Tomcat будет немного более явным в этом отношении (здесь мы надеемся).

В нашем приложении запущен фильтр gzip, упомянутый duffmo, web.xml выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd">

    <display-name>App-Web</display-name>

    <!-- FILTERS -->

    <!-- Gzip filter -->
    <filter>
        <filter-name>GZIPFilter</filter-name>
        <filter-class>weblogicx.servlet.gzip.filter.GZIPFilter</filter-class>
    </filter>

    [snip]    
</web-app>
1 голос
/ 31 марта 2011

Чтобы улучшить общую производительность веб-приложения J2EE на стороне клиента, вы можете попробовать Java-библиотеку WebUtilities.

Вот ссылка :: http://code.google.com/p/webutilities/.

Он предоставляет компоненты фильтров, тегов и сервлетов для применения различных методов повышения производительности на стороне клиента, что приводит к повышению рейтинга производительности по сравнению с PageSpeed ​​/ YSlow.

Начиная с версии 0.0.4, это помогает соблюдать следующие правила производительности.

  1. Минимизация HTTP-запросов - может обслуживать несколько файлов JS / CSS за один запрос
  2. Кэширование на стороне клиента - добавляет правильный Cache-Control, заголовок Expires
  3. Минимизация JS / CSS на лету - с помощью YUICompressor
  4. Сжатие - поддерживает двухстороннее сжатие для кодировок gzip / deflate / сжатие
  5. Кэширование ответов на сервере - чтобы избежать повторной обработки неизмененных ресурсов
  6. Добавить кодировку символов - сообщить браузеру заранее

Он также легко настраивается / настраивается для MIME, URL или User-Agent.

1 голос
/ 02 марта 2010

Я посмотрел документацию Tomcat здесь: http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

Упоминается использование compression="force", которое сработало для меня. Там также написано, что вы можете установить minimum number. Это работало нормально для меня

<Connector port="8080" compression="256000" />

(сжать что-нибудь более 256Кб)

Значение по умолчанию для compressableMimeType означало, что мне не нужен этот атрибут. Также обратите внимание, что в нем нет атрибута CompressionMinSize.

...