簡體   English   中英

Jetty-servlets GzipFilter不適用於Jetty 9.2.7.v20150116和Spring

[英]Jetty-servlets GzipFilter doesn't work with Jetty 9.2.7.v20150116 and Spring

我在web.xml -file中使用以下xml將GzipFilter配置為與Jetty一起運行的Spring應用程序。 在Chrome中使用開發人員工具進行檢查時,我希望資源的大小會變小,並且響應頭中的“編碼”值也應該為“ gzip”。 但是,這些都不是可見的。

但是,當在我的IDE中使用調試工具進行檢查時,我注意到過濾器已應用(我將斷點放置在GzipFilter上),並且在使用開發人員工具進行檢查時,我還注意到etag-header在響應中具有-gzip擴展名。 但是,內容似乎沒有壓縮。

我的想法不多了,不勝感激。

<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,application/json,image/svg+xml</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>GzipFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

編輯:添加請求和響應頭

 Request:
 GET ******* HTTP/1.1
 Host: localhost:8081
 Connection: keep-alive
 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)       AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
 Accept: */*
 Referer: http://localhost:8081/
 Accept-Encoding: gzip, deflate, sdch
 Accept-Language: en-US,en;q=0.8,fi;q=0.6
 Cookie: XSRF-TOKEN=******; JSESSIONID=*******

 Response:
 HTTP/1.1 200 OK
 Date: Mon, 29 Aug 2016 13:59:59 GMT
 Cache-Control: public
 Date: Mon, 29 Aug 2016 13:59:59 GMT
 Content-Type: application/javascript;charset=UTF-8
 Vary: Accept-Encoding, User-Agent
 ETag: "0f93db3b42f19c57f4a216dd80f63bae5--gzip"
 Server: Jetty(9.2.7.v20150116)
 Transfer-Encoding: chunked

ETag上的--gzip后綴由GzipFilter使用,以了解請求處理是否實際上通過GzipFilter

目的是如果請求曾經被壓縮,現在不再被壓縮,則將破壞DefaultServletETag支持。

含義如下:

  • 使用gzip配置的服務器
  • 請求資源/foo.js
  • DefaultServlet使用ETag: abcdef將響應發送到/foo.js
  • GzipFilter配置為壓縮application/javascript ,因此它壓縮了響應並將ETag更改為ETag: abcdef--gzip
  • 一段時間后,重新配置了GzipFilter(不同的url模式,不同的mime類型,等等)
  • 相同的User-Agent請求帶有ETag: abcdef--gzip資源/foo.js ,但這不再通過GzipFilter進行,因此DefaultServlet將無法識別ETag並重新提供內容。

至於為什么不壓縮您的內容,可能是由於您設置response.setContentType()還是響應主體內容的大小所致。

首先,您需要確保訪問響應輸出流(或編寫器) 之前始終設置響應狀態代碼,響應標頭和(可選)響應緩沖區大小,因為.getOutputStream().getWriter()都使用響應對象中的值進行設置。

GzipFilter還使用這些值來知道是否應壓縮響應。

接下來,響應主體內容的大小很重要,因為在涉及GzipFilter之前,響應大小有一個下限。 (它實際上無法有效地壓縮GzipFilter.minGzipSize以下的大多數內容)

在您的Jetty版本中,我相信minGzipSize是256個字節。

由於您粘貼的響應標頭沒有Content-LengthTransfer-Encoding: chunked ,因此我無法確定您的響應實際有多大。

重要的升級說明:Jetty 9.3+中的GzipFilter已被完全棄用,如果使用,將導致無操作。 這是因為在使用Servlet 3.1和異步I / O時,用於Gzip壓縮的過濾器方法存在很大問題。

Jetty 9.3+中的Gzip支持已移出Servlet規范,並移至較低級別的HttpOutput.Interceptor模式,該模式僅在發生刷新(指定內部自動或應用程序)后才壓縮內容。

換句話說,servlet緩沖區在從應用程序寫入servlet緩沖區時不會被壓縮,就像在Jetty 9.2及之前的版本中一樣。 相反,僅當它們離開servlet緩沖區並進入網絡級寫入時才壓縮它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM