Spring mvc Gzip壓縮 前後端交流的String__Java

來源:互聯網
上載者:User

因項目的需要,需要對前後端傳輸的資料進行壓縮,使用的壓縮方式是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 

效果還是非常出色的.





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.