2011-09-22 5 views
2

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

Вот что запрос и ответ выглядеть в начале метода службы() сервлета:

Request: [GET /test/hello_world?param=test]@11538114 [email protected] 
Response: [email protected] 
WORKED! 

Request:[GET /test/hello_world?param=test]@19386718 [email protected] 
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() выдает исключение IO. Почему это?

ответ

1

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

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

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

0

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

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

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

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

Вы можете использовать другой GzipFilter. Добавьте его в свой мавена или загрузить файл 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); 

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

Смежные вопросы