分享

Java压缩技术(五) GZIP相关——浏览器解析

 集微笔记 2013-08-08
昨天一篇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:zlex.dongliang@gmail.com">梁栋</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实现

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多