浏览器解析GZIP

[原文地址:http://snowolf.iteye.com/blog/643443]

昨天一篇GZIP相关实现引起大家的广泛关注,为一位朋友验证一下浏览器对gzip的支持情况,才有此文! 

相关链接: 
Java压缩技术(一) ZLib 
Java压缩技术(二) ZIP压缩——Java原生实现 
Java压缩技术(三) ZIP解压缩——Java原生实现 
Java压缩技术(四) GZIP——Java原生实现 
Java压缩技术(五) GZIP相关——浏览器解析 
Java压缩技术(六) BZIP2——Commons实现 
Java压缩技术(七) TAR——Commons实现 

GZIP本身就是一种网络流压缩算法,而且应用相当广泛。如果网络访问过程中,其数据流较大,势必降低网络访问效率,此时就需要考虑使用压缩!当然,在浏览器与服务器的交互中,要考虑浏览器是否支持这些算法,以及服务器运行压缩所带来的负载。如果你关注浏览器上传的“Accept-Encoding”属性,你就能看明白这一点。 

GZIP如何压缩,我这里就不废话了,不清楚的朋友请关注(Java压缩技术(四) GZIP——Java原生实现) 
至于如何使得服务器支持gzip的流输出,关键点只有一行代码: 

Java代码
  1. response.setHeader("Content-Encoding""gzip");  

经过这项设置,浏览器就能够很好的作出响应! 
先看FireFox,如图: 
 
再看Opera,如图: 
 
浏览器在打开该页面时,就可解压获得并展示其内容!  
至于IE就惨了,愣是要求下载!  可能缺少什么设置!(注意后续服务器配置!  不是无解哦!) 
 你不信就这么简单?上代码! 
Java代码 
  1. /** 
  2.  * 2010-4-14 
  3.  */  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.OutputStream;  
  7. import java.util.zip.GZIPOutputStream;  
  8.   
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. /** 
  15.  * GZip服务 
  16.  *  
  17.  * @author <a href="mailto:[email protected]">梁栋</a> 
  18.  * @since 1.0 
  19.  */  
  20. public class GZipServlet extends HttpServlet {  
  21.   
  22.     private static final long serialVersionUID = -4811926975427533081L;  
  23.     private static final String ENCODING = "UTF-8";  
  24.   
  25.     /** 
  26.      * 压缩 
  27.      *  
  28.      * @param data 
  29.      * @return 
  30.      * @throws Exception 
  31.      */  
  32.     private byte[] compress(byte[] data) throws Exception {  
  33.   
  34.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  35.   
  36.         // 压缩  
  37.         GZIPOutputStream gos = new GZIPOutputStream(baos);  
  38.   
  39.         gos.write(data, 0, data.length);  
  40.   
  41.         gos.finish();  
  42.   
  43.         byte[] output = baos.toByteArray();  
  44.   
  45.         baos.flush();  
  46.         baos.close();  
  47.   
  48.         return output;  
  49.     }  
  50.   
  51.     /** 
  52.      * @param request 
  53.      * @param response 
  54.      * @throws ServletException 
  55.      * @throws IOException 
  56.      */  
  57.     private void excute(HttpServletRequest request, HttpServletResponse response)  
  58.             throws ServletException, IOException {  
  59.   
  60.         byte[] data = "我是一个中国人!".getBytes(ENCODING);  
  61.   
  62.         try {  
  63.             byte[] output = compress(data);  
  64.   
  65.             // 设置Content-Encoding,这是关键点!  
  66.             response.setHeader("Content-Encoding""gzip");  
  67.             // 设置字符集  
  68.             response.setCharacterEncoding(ENCODING);  
  69.             // 设定输出流中内容长度  
  70.             response.setContentLength(output.length);  
  71.   
  72.             OutputStream out = response.getOutputStream();  
  73.             out.write(output);  
  74.             out.flush();  
  75.             out.close();  
  76.         } catch (Exception e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.     }  
  80.   
  81.     /** 
  82.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
  83.      *      response) 
  84.      */  
  85.     protected void doGet(HttpServletRequest request,  
  86.             HttpServletResponse response) throws ServletException, IOException {  
  87.         excute(request, response);  
  88.     }  
  89.   
  90.     /** 
  91.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 
  92.      *      response) 
  93.      */  
  94.     protected void doPost(HttpServletRequest request,  
  95.             HttpServletResponse response) throws ServletException, IOException {  
  96.         excute(request, response);  
  97.     }  
  98.   
  99. }  

其实,就这些内容!  
当然,除了上述代码方式,针对于tomcat可以通过修改配置获得支持!  
Xml代码
  1. <Connector   
  2.               port="8080"   
  3.               protocol="HTTP/1.1"  
  4.               connectionTimeout="20000"  
  5.               redirectPort="443"   
  6.               URIEncoding="UTF-8"  
  7.               compression="on"     
  8.               noCompressionUserAgents="gozilla, traviata"     
  9.               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json"   
  10. />    

说说配置细节: 
compression="on"   开启压缩支持  
noCompressionUserAgents="gozilla, traviata"   不压缩的内容  
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json" 压缩的类型  

至于代码,你无需写一行代码!轻松获得服务器访问加速!   并且IE也支持哦!  
工程在我的附件里,请下载验证!  

相关链接: 
Java压缩技术(一) ZLib  
Java压缩技术(二) ZIP压缩——Java原生实现  
Java压缩技术(三) ZIP解压缩——Java原生实现  
Java压缩技术(四) GZIP——Java原生实现  
Java压缩技术(五) GZIP相关——浏览器解析  
Java压缩技术(六) BZIP2——Commons实现  
Java压缩技术(七) TAR——Commons实现

你可能感兴趣的:(网页GZIP压缩,浏览器GZIP支持)