Проблема с настройкой GzipFilter в Jetty - PullRequest
3 голосов
/ 07 января 2010

Я пытаюсь настроить Jetty для обслуживания сжатого HTML-контента. В web.xml я установил GzipFilter и сопоставил его с / *, но это, похоже, не работает. Вот конфигурация фильтра:

<filter>
 <filter-name>GZipFilter</filter-name>
 <display-name>Jetty's GZip Filter</display-name>
 <description>Filter that zips all the content on-the-fly</description>
 <filter-class>org.mortbay.servlet.GzipFilter</filter-class>
 <init-param>
  <param-name>mimeTypes</param-name>
  <param-value>text/html</param-value>
 </init-param>
</filter>

<filter-mapping>
 <filter-name>GZipFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

Я только начинаю использовать Jetty, поэтому решение может быть смехотворно простым. Если вы можете связать меня с документацией, которая может мне помочь, это тоже было бы здорово.

Ответы [ 6 ]

3 голосов
/ 06 августа 2013

Я тоже отвечу на это, так как у меня была огромная головная боль, пытавшаяся сделать эту работу, и я наконец сделал это. Кроме того, я не являюсь крупным экспертом в тонких деталях HTTP, поэтому я дам непрофессиональный ответ.

Во-первых, вот как я проверил, работает ли мой GZipFilter или нет. Запустил Firefox, убедился, что у меня есть аддон Firebug, запустил аддон Firebug, перешел на вкладку «Net». Затем я получил доступ к URL, который должен вернуть GZipped ответ. Вот что показывает Firebug:

enter image description here

В столбце «Размер» отображается размер ответа. Если навести указатель мыши на метку столбца «Размер», он скажет вам, что если ответ сжат, то будет отображен сжатый размер ответа.

Все это было сделано с включенным фильтром GZip в Jetty. Затем я удалил объявление фильтра GZip из моего файла web.xml, перезапустил Jetty и повторил тест. На этот раз размер ответа был точно таким же, как и раньше, что ясно указывало на то, что сжатие GZip не работало.

После нескольких проб и ошибок я посмотрел в Firebug раздел «Заголовки запроса», чтобы увидеть значение для заголовка «Принять». Я заметил, что здесь есть такие значения, как «application / xml» и «text / xml», но способ, которым я настроил параметр init моего фильтра GZIp «mimeTypes», содержал только «text / xml» (и отсутствовал) приложение / XML "). Это было настроено так:

<filter>
      <filter-name>GzipFilter</filter-name>
      <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
      <init-param>
        <param-name>mimeTypes</param-name>  
        <param-value>text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml,application/json,application/xml; charset=UTF-8</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>GzipFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

После добавления значения «application / xml» в список, например, так:

<filter>
      <filter-name>GzipFilter</filter-name>
      <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
      <init-param>
        <param-name>mimeTypes</param-name>  
        <param-value>text/html,text/plain,text/xml,application/xhtml+xml,application/xml,text/css,application/javascript,image/svg+xml,application/json,application/xml; charset=UTF-8</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>GzipFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

Я переделал свой предыдущий тест, и, конечно же, теперь сообщенный размер ответа был намного меньше:

enter image description here

Также обратите внимание, что теперь сообщаемые заголовки ответа содержат дополнительное поле с именем «Content-Encoding» со значением «gzip».

Таким образом, в основном идея состоит в том, чтобы проверить, какие значения вы отправляете в заголовке запроса «Принять», и убедиться, что все эти значения сконфигурированы в параметре init «mimeTypes» фильтра GZip.

3 голосов
/ 02 февраля 2012

сжатие GZIP

GZIP-сжатие можно использовать для уменьшения объема данных, передаваемых «по проводам». Сжатие применяется в качестве транспортной кодировки. Это может значительно улучшить производительность веб-приложения, однако оно также может потреблять больше ресурсов ЦП, а некоторые данные (например, изображения) не могут быть хорошо сжаты.

Статическое содержимое

Сервлет Jetty по умолчанию может служить в качестве транспортной кодировки статического содержимого с предварительным сжатием и избежать затрат на сжатие на лету. Если для параметра init gzip задано значение true, Jetty будет искать сжатые статические ресурсы. Таким образом, если получен запрос на «foo.txt» и существует файл «foo.txt.gz», то он будет обслуживаться как «foo.txt» с транспортной кодировкой gzip.

GzipFilter

Jetty Gzip Filter - это фильтр сжатия, который можно применять практически к любому динамическому ресурсу (сервлету). Он исправляет многие ошибки в общедоступных фильтрах сжатия (например, обрабатывает все способы, которыми может быть задана длина контента), и тестировал с продолжениями Jetty и приостановками запросов.

Некоторые пользовательские агенты могут быть исключены из сжатия, чтобы избежать некоторых распространенных ошибок браузера (да, это означает IE!).

см. От пристани: http://docs.codehaus.org/display/JETTY/GZIP+Compression

Вы можете посмотреть исходный код Gzipfilter, здесь много полезных комментариев: http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/servlets/GzipFilter.html

1 голос
/ 27 сентября 2016

На пристани 9,3:

  1. отредактируйте файл jetty.conf и включите XML-файл "jetty-gzip.xml"

  2. отредактируйте файл start.ini и добавьте "--module = servlets"

  3. отредактируйте файл jetty-gzip.xml и настройте нужные типы mime.

  4. Перезапустите причал и повторите проверку.

1 голос
/ 18 февраля 2013

Иногда использование Gzipfilter имеет некоторые проблемы, в зависимости от того, как вы обрабатываете буферы и очищаете. Таким образом, использование org.eclipse.jetty.servlets.IncludableGzipFilter (которое фактически расширяет GzipFilter) может решить ваши проблемы.

0 голосов
/ 05 декабря 2011

Отправляете ли вы запрос с заголовком запроса «Content-Encoding: gzip»?

0 голосов
/ 17 февраля 2010

В чем была ошибка? У вас проблемы с classpath или что-то еще? Если classpath, вам нужно убедиться, что класс gzipfilter доступен во время выполнения пристани, или он умрет.

...