因項目的需要,需要對前後端傳輸的資料進行壓縮,使用的壓縮方式是GZIP
Gzip壓縮會把String壓縮成一大推亂碼,但是這個過程對使用者而言是透明的,瀏覽器會自動的對壓縮的內容進行解析,所以使用者看到的還是正常的內容.
使用純servlet 進行壓縮測試非常的簡單.
package com.test;import java.io.IOException;import java.io.PrintWriter;import java.util.zip.GZIPOutputStream;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/Test")public class Test extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setCharacterEncoding("utf-8");request.setCharacterEncoding("gbk");response.setContentType("text/html;charset=gbk"); response.addHeader("Content-Encoding", "gzip"); PrintWriter out=new PrintWriter (new GZIPOutputStream (response.getOutputStream())); //PrintWriter out=response.getWriter();out.write("哈哈哈哈哈");out.close(); //記住這一句很重要,要不然沒辦法顯示}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
瀏覽器開F12直接存取
可以看到使用了Gzip 壓縮,長度是25(ps:未壓縮長度是10,有興趣的可以試一試)
所以小文本壓縮,不見得有優勢
可能有的人說,我就想看看 他壓縮成什麼樣子了,可以!!只不過要裝個軟體 fidder
開啟軟體 再訪問一次
這個時候就可以看到 壓縮後的資料了,只不過我們的瀏覽器比較的智能,自動幫你再解壓了,所以對使用者透明
下面切換到重點,現在用純servlet開發的人少了,大家都喜歡用架構了,就拿比較流行的springmvc距離,基本上都搞註解了
其中前後端傳遞文本的註解是@ResponseBody
加上這個註解,直接返回String,返回的內容就會顯示在瀏覽器上
為什麼函數上一個註解 就可以做到了? 仔細想想,應該是SpringMvc接管了response.getOutputStream(),自動幫我們填充String內容進去,然後前端就能看到
問題是我們使用gzip壓縮,就要對response.getOutputStream()進行封裝,兩個衝突了
如果還像純servlet寫的話,就會報錯:GZip 頭中的幻數不正確。請確保正在傳入 GZip 流
其實我們可以換一張思路,springmvc接管了response.getOutputStream(),但是springmvc還要在tomcat裡面運行啊,
直接對tomcat修改不就ok 了.試了一下果然可以.
並且只要修改一個檔案,其他的代碼都不需要修改,保持原樣即可
只要修改 %TOMCAT_HOME%/conf/server.xml 找到 如下的標籤 添加如下內容:
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8" compression="on" compressionMinSize="50" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
這回用一串大的String來進行測試
開啟fidder,開下效果:
如果不壓縮,看下多大:
從 3232byte壓縮到1088 byte 壓縮了2/3
效果還是非常出色的.