Jetty 8 GzipFilter не применяется иногда - PullRequest
2 голосов
/ 22 сентября 2011

Я только что обновил свой веб-сервер с Jetty 6.x до Jetty 8.0.1, и по какой-то причине, когда я делаю точно такой же запрос, иногда ответ получен в Gzipped, а иногда нет.

Вот как выглядят запрос и ответ в начале метода service () сервлета:

Request: [GET /test/hello_world?param=test]@11538114 org.eclipse.jetty.server.Request@b00ec2
Response: org.eclipse.jetty.servlets.GzipFilter$2@1220fd1
WORKED!

Request:[GET /test/hello_world?param=test]@19386718 org.eclipse.jetty.server.Request@127d15e
Response:HTTP/1.1 200 
Connection: close
FAILED!

Вот мое объявление GzipFilter:

EnumSet<DispatcherType> all = EnumSet.of(DispatcherType.ASYNC, DispatcherType.ERROR, DispatcherType.FORWARD,
            DispatcherType.INCLUDE, DispatcherType.REQUEST);
FilterHolder gzipFilter = new FilterHolder(new GzipFilter());
gzipFilter.setInitParameter("mimeTypes", "text/javascript");
gzipFilter.setInitParameter("minGzipSize", "0");
context.addFilter(gzipFilter, "/test/*", all);

Javadoc говорит, что:

GZIP Filter This filter will gzip the content of a response if:
    The filter is mapped to a matching path ==>
    The response status code is >=200 and <300
    The content length is unknown or more than the minGzipSize initParameter or the minGzipSize is 0(default)
    The content-type is in the comma separated list of mimeTypes set in the mimeTypes initParameter or if no mimeTypes are defined the content-type is not "application/gzip"
    No content-encoding is specified by the resource

Мне кажется, что все эти условия выполнены в моем случае, за исключением, может быть, последнего "Ресурсом не указана кодировка содержимого". Как я могу это проверить?

Плюс, по причине, которую я тоже игнорирую, когда ответ не фильтруется с помощью GzipFilter, response.getWriter () генерирует исключение ввода-вывода. Почему это?

Ответы [ 3 ]

1 голос
/ 09 октября 2011

У меня была такая же проблема, и я нашел 2 причины:

  1. Если какой-либо из ваших сервлетов преждевременно вызовет response.getWriter (). Flush (), GZipFilter не будет работать. В моем случае это делали и Freemarker в Spring MVC, и Sitemesh, поэтому мне пришлось установить для параметра «auto_flush» для Freemarker значение «false» для сервлета Freemarker и объекта конфигурации Spring MVC Freemarker.
  2. Если вы используете обычный GzipFilter, по какой-то причине он не позволяет вам устанавливать какие-либо заголовки на этапе «включение» на Jetty. Поэтому мне пришлось использовать IncludableGzipFilter вместо.

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

0 голосов
/ 12 августа 2015

Вы можете использовать другой GzipFilter.Добавьте его в свой maven или скачайте jar-файл http://mvnrepository.com/artifact/net.sourceforge.pjl-comp-filter/pjl-comp-filter/1.7

А затем просто немного измените свой код:

EnumSet<DispatcherType> all = EnumSet.of(DispatcherType.ASYNC,     DispatcherType.ERROR, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.REQUEST);
FilterHolder gzipFilter = new FilterHolder(new CompressingFilter());
gzipFilter.setInitParameter("includeContentTypes", "text/javascript");
context.addFilter(gzipFilter, "/test/*", all);

У меня была та же проблема, и это решило проблему.

0 голосов
/ 23 сентября 2011

Могу ли я предложить вам использовать Fiddler для отслеживания HTTP-запросов?

Может быть, заголовок типа Last-Modified указывает вашему браузеру, что содержание вашего запроса /test/hello_world?param=testвсе тот же ... Итак, ваш браузер повторно использует содержимое своего кэша и просто закрывает запрос, не считывая его содержимое ...

Что происходит с двумя разными запросами?

  • /test/hello_world?param=test
  • /test/hello_world?param=test&foo=1
...