2010-01-07 140 views
3

我試圖設置Jetty來提供壓縮的html內容。在web.xml中,我設置GzipFilter並將其映射到/ *,但這似乎不起作用。這裏的過濾器配置:在Jetty中設置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,所以解決方案可能會非常簡單。如果您可以將我鏈接到可能幫助我的文檔,那也會很棒。

回答

0

錯誤是什麼?你是否遇到類路徑問題或其他問題?如果類路徑,你需要確保gzipfilter類可用於jetty運行時,否則將會死亡。

+1

我終於有時間回到這個問題。我沒有收到任何錯誤。但是我沒有看到實際發生的任何gzip。我如何檢查過濾器是否實際運行? – Misha 2010-09-27 17:30:16

+0

@Misha,你可以使用TCP數據包跟蹤軟件,或使用一些在線工具檢查,如http://www.gidnetwork.com/tools/gzip-test.php – spektom 2011-06-19 13:21:40

-1

您是否使用「Content-Encoding:gzip」請求標頭髮送請求?

3

GZIP壓縮

GZIP壓縮可以被用來減少被髮送「通過線路」的數據量。壓縮作爲傳輸編碼應用。這可以大大提高Web應用程序的性能,但是它也可能消耗更多的CPU,並且某些內容(例如圖像)無法很好地壓縮。

靜態內容

碼頭默認的servlet可以起到預壓縮靜態內容作爲傳輸編碼,避免對即時壓縮的費用。如果「gzip」init參數設置爲true,那麼Jetty將查找壓縮的靜態資源。因此,如果收到「foo.txt」的請求並且存在「foo.txt.gz」文件,那麼它將作爲「foo.txt」使用gzip傳輸編碼。

GzipFilter

碼頭Gzip已過濾器是可應用於幾乎任何動態資源(servlet的)一個壓縮濾波器。它修復了通常可用的壓縮過濾器中的許多錯誤(例如處理所有可能設置內容長度的方式),並且已經使用Jetty繼續和暫停請求進行了測試。

某些用戶代理可能被排除在壓縮之外,以避免一些常見的瀏覽器錯誤(是的,這意味着IE!)。

從碼頭DOC參考: http://docs.codehaus.org/display/JETTY/GZIP+Compression

你可以看看Gzipfilter源代碼,這裏有很多有用的意見: http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/servlets/GzipFilter.html

1

有時使用Gzipfilter存在一些問題,這取決於你是如何處理的緩衝區並沖洗。因此,使用org.eclipse.jetty.servlets.IncludableGzipFilter(實際上是一個擴展GzipFilter)可以解決你的問題。

3

我也要回答這個問題,因爲我已經做了大量的工作,我終於做到了。另外,我並不是HTTP細節方面的專家,所以我會給出非專業的答案。

首先,我是如何檢查我的GZipFilter是否工作。開始使用Firefox,確保我擁有Firebug插件,啓動Firebug插件,進入「網絡」選項卡。然後我訪問了應該返回GZip的響應的URL。下面是螢火蟲顯示:

enter image description here

「尺寸」列顯示響應的大小。如果將鼠標懸停在「大小」列標籤上,它會告訴您,如果響應被壓縮,則它會顯示響應的壓縮大小。

這一切都是在Jetty中啓用的GZip過濾器完成的。然後我從我的web.xml中刪除了GZip過濾器聲明,重新啓動了Jetty並重復了測試。這次響應的尺寸與之前的尺寸完全相同,這清楚地表明GZip壓縮不起作用。

經過多次試驗和錯誤,我所做的是在Firebug的「請求標題」部分查看「Accept」標題的值。我注意到,這裏有「application/xml」和「text/xml」等值,但是我配置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> 

加入了「應用程序/ 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

另請注意,現在報道的響應頭包含稱爲「內容編碼」的額外字段的值「壓縮」。

所以基本上這個想法是檢查你的請求「接受」頭髮送什麼樣的值,並確保所有這些值都配置在GZip過濾器的「mimeTypes」初始參數。

1

在碼頭9.3:

  1. 編輯jetty.conf,包括xml文件 「碼頭-gzip.xml」

  2. 編輯start.ini,並添加 「--module = servlet的」

  3. 編輯jetty-gzip.xml並配置你想要的MIME類型。

  4. 重新啓動碼頭並再次測試。