[英]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
。
目的是如果請求曾經被壓縮,現在不再被壓縮,則將破壞DefaultServlet
的ETag
支持。
含義如下:
/foo.js
ETag: abcdef
將響應發送到/foo.js
application/javascript
,因此它壓縮了響應並將ETag
更改為ETag: abcdef--gzip
ETag: abcdef--gzip
資源/foo.js
,但這不再通過GzipFilter進行,因此DefaultServlet
將無法識別ETag
並重新提供內容。 至於為什么不壓縮您的內容,可能是由於您設置response.setContentType()
還是響應主體內容的大小所致。
首先,您需要確保在訪問響應輸出流(或編寫器) 之前始終設置響應狀態代碼,響應標頭和(可選)響應緩沖區大小,因為.getOutputStream()
和.getWriter()
都使用響應對象中的值進行設置。
GzipFilter還使用這些值來知道是否應壓縮響應。
接下來,響應主體內容的大小很重要,因為在涉及GzipFilter之前,響應大小有一個下限。 (它實際上無法有效地壓縮GzipFilter.minGzipSize
以下的大多數內容)
在您的Jetty版本中,我相信minGzipSize
是256個字節。
由於您粘貼的響應標頭沒有Content-Length
和Transfer-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.