GZIPFilter

Jayson Falkner 在他的Two Servlet Filters Every Web Application Should Have(http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html?page=1 ) 裏面介紹了2個提高Java Web Application 效能的Servlet。這裏記一下其中的GZIPFilter。
GZIPFilter可以用gzip的方式壓縮HTTP Response的內容,從而在Server端加快了響應回覆的速度(gzip壓縮過程需耗用CPU資源,卻大幅減輕了網卡的處理負擔),在Client端縮短了頁面刷新時間,在網絡內減少了數據流量。另一方面,因爲採用的Filter的方式,無需改動應用現有的代碼就可引入該功能。

 


以上Filter的source code在這裏(http://www.onjava.com/onjava/2003/11/19/examples/jspbook.zip )下載。當然也可以在這裏(http://www.onjava.com/onjava/2003/11/19/examples/jspbook.jar )下載現成的JAR。

作者定義了3個類來實現這個壓縮功能:GZIPFilter, GZIPResponseWrapper, GZIPResponseStream。類圖大致如下:

 


這3個類要做的,就是在Server將響應內容裝入HTTP Response之前,先對內容進行GZIP壓縮。其中GZIPFilter實現了javax.servlet.Filter接口,在Java Web Container處理HTTP Response的過程中便可以掛載使用。另外2個類(GZIPResponseWrapper,GZIPResponseStream)基本上是輔助類,真正的壓縮動作是在GZIPResponseStream中由java.util.zip.GZIPOutputStream來完成的,除此還有其它的一些方法,感覺似乎並沒有全部用到。這部分還需要另外再研究。

 


要佈署這個Filter也很簡單。只要將JAR放至應用的library目錄,並且在應用的佈署配置文件web.xml中加入

<filter>

<filter-name>GZIPFilter</filter-name>

<filter-class>com.jspbook.GZIPFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>GZIPFilter</filter-name>

<url-pattern>/*.jsp</url-pattern>

</filter-mapping>

然後啓動Server就可以了。

GZIPFilter壓縮HTTP Response內容的作用非常明顯。作者在source code的包裏面另外放了TestGZIP.jsp,這是用來顯示GZIPFilter的壓縮效果的JSP。你可以找一支產生大量內容的目標JSP來測驗一下,就像下面這支show_response_compressed.jsp:

 


<%@ page import="java.io.*" %>

<%@ page import="java.util.zip.*" %>

 


<%

String title = "Show Compressed Response";

int size = 100000;

 


out.println("<HTML>/n" +

"<HEAD><TITLE>" + title + "</TITLE></HEAD>/n" +

"<BODY BGCOLOR=/"#FDF5E6/">/n" +

"<H1 ALIGN=/"CENTER/">" + title + " SIZE="+size+"</H1>/n");

 


String line = "Blah, blah, blah, blah, blah. " +

"Yadda, yadda, yadda, yadda.";

for(int i=0; i<size; i++) {

out.println(line);

}

out.println("</BODY></HTML>");

 


%>

運行show_response_compressed.jsp可以產生類似如下截圖中的頁面。

 

 

 

運行TestGZIP.jsp,在URL中填入show_response_compressed.jsp 所在的地址,提交後即可得到如下結果。

 


 

可以看到,未經壓縮的HTTP Response數據量達到了2,950,086 bytes (2.9MB),而壓縮後的數據量僅有8,687 bytes(8 KB),壓縮比高達99.7%!

 


因爲是在一臺機器上作的驗證,所以在響應時間的改善方面感覺不是很明顯。同樣的,如果是在Intranet環境內,則這種效果也不會很明顯。如果是在Internet上測試,改善的效果應該會比較明顯。

 


--END

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章