`

服务器使用Gzip压缩数据,加快网络传输

阅读更多

        服务器使用Gzip压缩数据,加快网络传输,提高页面性能。使用方法也很简单,在web.xml进行过滤器的配置即可,如下所示。

<filter>
    <filter-name>gzipFilter</filter-name>  
    <filter-class>
        net.sf.ehcache.constructs.web.filter.GzipFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>gzipFilter</filter-name>
    <url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>gzipFilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>gzipFilter</filter-name>
    <url-pattern>*.gif</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>gzipFilter</filter-name>
    <url-pattern>*.css</url-pattern>
</filter-mapping>

        当然,还要引入相关的两个jar包,ehcache-web-2.0.4.jar和ehcache.jar。

        使用gzip,首先要设置请求消息头Accept-Encoding为gzip。这样,你将会得到一个响应,根据消息头Content-Encoding为gzip你可以知道,传输过来的数据是经过gzip压缩的。另外,消息头Content-Length会告诉你压缩后的数据长度。

        反编译看到GzipFilter.java的doFilter方法如下,有设置Content-Length。

protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
  throws Exception
{
  if ((!(isIncluded(request))) && (acceptsEncoding(request, "gzip")) && (!(response.isCommitted())))
  {
    if (LOG.isDebugEnabled()) {
      LOG.debug(request.getRequestURL() + ". Writing with gzip compression");
    }

    ByteArrayOutputStream compressed = new ByteArrayOutputStream();
    GZIPOutputStream gzout = new GZIPOutputStream(compressed);

    GenericResponseWrapper wrapper = new GenericResponseWrapper(response, gzout);
    wrapper.setDisableFlushBuffer(true);
    chain.doFilter(request, wrapper);
    wrapper.flush();

    gzout.close();

    if (response.isCommitted()) {
      return;
    }

    switch (wrapper.getStatus())
    {
    case 204:
    case 205:
    case 304:
      return;
    }

    byte[] compressedBytes = compressed.toByteArray();
    boolean shouldGzippedBodyBeZero = ResponseUtil.shouldGzippedBodyBeZero(compressedBytes, request);
    boolean shouldBodyBeZero = ResponseUtil.shouldBodyBeZero(request, wrapper.getStatus());
    if ((shouldGzippedBodyBeZero) || (shouldBodyBeZero))
    {
      response.setContentLength(0);
      return;
    }

    ResponseUtil.addGzipHeader(response);

    if (this.setVaryHeader) {
      ResponseUtil.addVaryAcceptEncoding(wrapper);
    }

    response.setContentLength(compressedBytes.length);

    response.getOutputStream().write(compressedBytes);
  }
  else
  {
    if (LOG.isDebugEnabled()) {
      LOG.debug(request.getRequestURL() + ". Writing without gzip compression because the request does not accept gzip.");
    }
    chain.doFilter(request, response);
  }
}

        进一步看ResponseUtil.addGzipHeader方法,有设置消息头Content-Encoding为gzip。

public static void addGzipHeader(HttpServletResponse response)
  throws ResponseHeadersNotModifiableException
{
  response.setHeader("Content-Encoding", "gzip");
  boolean containsEncoding = response.containsHeader("Content-Encoding");
  if (!(containsEncoding))
    throw new ResponseHeadersNotModifiableException("Failure when attempting to set Content-Encoding: gzip");
}
        配置好后,要在浏览器端验证是否做了压缩,可以安装http Watch工具,在IE浏览器中查看,如下所示。
        未配置gzip压缩前:
        配置gzip压缩后:可以看到压缩比例


PS:网上看到用Java实现的gzip
GetMethod method = new GetMethod(url);//生成一个get方法实例  
  
method.setQueryString(queryString);//设置查询字符串  
method.addRequestHeader("Accept-Encoding", "gzip");//设置接受响应消息为gzip  
  
HttpClient client = new HttpClient();//生成执行get方法的客户端实例  
client.executeMethod(method);//执行get方法  
  
InputStream in = method.getResponseBodyAsStream();//获取响应消息体  
Header contentEncoding = method.getResponseHeader("Content-Encoding");//获取消息头Content-Encoding判断数据流是否gzip压缩过  
  
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {  
    GZIPInputStream gzipIn = new GZIPInputStream(in);  
    int len = Integer.parseInt(method.getResponseHeader("Content-Length").getValue());  
    byte[] b = new byte[len];  
    gzipIn.read(b);  
      
    String json = new String(b);  
    System.out.println(json);  
}

        使用gzip在服务器端压缩数据的例子

byte[] result = data.getBytes("UTF-8");  
  
if(response.getHeader("Accept-Encoding").equalsIgnoreCase("gzip"))  
{  
    // System.out.println("Before compression, the data size is :"+ result.length);  
    // Using gzip compress the data  
    ByteArrayOutputStream out = new ByteArrayOutputStream();  
    GZIPOutputStream gout = new GZIPOutputStream(out);  
    gout.write(json.getBytes("UTF-8"));  
    gout.close();  
    result = out.toByteArray();  
  
    // System.out.println("After compression, the data size is "+gzipResult.length);  
    this.getResp().setHeader("Content-Encoding","gzip");  
    this.getResp().setHeader("Content-Length", result.length+"");  
}  
  
response.getOutputStream().write(result);  

 

参考文章:http://blog.csdn.net/hpli148/article/details/7468573

  • 大小: 4.7 KB
  • 大小: 6.4 KB
分享到:
评论

相关推荐

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩 最近流行的网络游戏(FLASH)数据传输都是用GZIP进行压缩与解压缩的,在客户端FLASH对与服务器交互的数据进行解压缩,

    Gzip压缩技术以及压缩算法

    大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来....

    NodeJS服务器实现gzip压缩的示例代码

    本文介绍了NodeJS服务器实现gzip压缩,分享给大家,具体如下: 在浏览器向服务器请求静态资源时,服务器为了减小在网络传输过程中消耗的流量和时间,都是将静态资源经过压缩后返回给服务器的,实现压缩的算法有 ...

    VC6 gzip 压缩解压 测试代码 使用gzip.dll

    VC6 gzip 压缩解压 测试代码 使用gzip.dll windows2003自带的gzip库,用于网络数据传输的压缩解压,兼容目前所有的网络服务器

    asp.net网站使用GZIP压缩源代码

    本文主要讲述ASP.NET网站开发者,给网站增加GZIP压缩模块,提高网页传输速度,由此增加页面显示速度。 代码采用VS2008开发,使用.net framework2.0,如果你需要用VS2005开发,把文件依次COPY过去即可。 什么是网页...

    Node.js服务器开启Gzip压缩教程

    大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来....

    在IIS上启用Gzip压缩详细方法(HTTP压缩)

    摘要 本文总结了如何为使用IIS托管的网站启用Gzip压缩, 从而减少网页网络传输大小, 提高用户显示页面的速度. 二.前言. 本文的知识点是从互联网收集整理, 主要来源于中文wiki. 使用YSlow检测网站启用了哪些优化时, ...

    IIS的Gzip压缩图文教程

    网站的访问速度是由多个因素所共同决定的,这些因素例如应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度,服务器是否启用GZip压缩等等。

    IIS开启GZIP压缩效率对比及部署方法小结

    压缩的最大好处就是降低了网络传输的数据量,从而提高客户端浏览器的访问速度。当然,同时也会增加一点点服务器的负担。GZIP是比较常见的一种HTTP压缩算法。 压缩测试在部署的IIS 6.0上配置了GZIP压缩,详细的测试...

    Tomcat7中开启gzip压缩功能的配置方法

    使用gzip压缩可以减少数据传输大小,加快网页加载速度。很多大站都开启了gzip压缩,不过也有很多网站并没有开启gzip压缩,上次看了一篇文章说开启gzip压缩后对搜索引擎不友好,但从带宽和流量的角度来看,还是有必要...

    关于HTTP传输中gzip压缩的秘密探索分析

    而这些好处并不仅仅限于静态内容,PHP动态页面和其他动态生成的内容均可以通过使用Apache压缩模块压缩,加上其他的性能调整机制和相应的服务器端 缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux服务器...

    远程JSP服务器文件管理工具WEB工程源码

    内置 GZIP 压缩过滤器加快网页传输. 我们租用虚拟主机或者建立自己企业的服务器的时候经常会遇到文件管理的问题, 用 FTP 方式固然方便, 不过总是需要用一个 FTP 终端软件来管理, 而这个工具可以帮你只要有浏览器, ...

    在IIS上启用Gzip压缩 (HTTP压缩)第1/3页

    摘要 本文总结了如何为使用IIS托管的网站启用Gzip压缩, 从而减少网页网络传输大小, 提高用户显示页面的速度. 二.前言. 本文的知识点是从互联网收集整理, 主要来源于中文wiki. 使用YSlow检测网站启用了哪些优化时, ...

    apache启用gzip压缩的实现方法

    利用Apache中的Gzip模块,我们可以使用Gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器。这样经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。 网页...

    Compress页面压缩

    答案是肯定的,早在HTTP 1.1标准发布的时候,浏览器就已经开始提供了对压缩数据的支持,而且Web服务器也开始支持数据压缩,著名的Apache服务器就提供了gzip压缩功能,IIS 5可以通过外挂实现gzip压缩,IIS 6则内部...

    Nginx启用GZIP压缩网页传输方法(推荐)

    浏览器—请求—-&gt; 声明可以接受 gzip压缩 或 deflate压缩 或compress 或 sdch压缩 从http协议的角度看–请求头 声明 acceopt-encoding: gzip deflate sdch (是指压缩算法,其中sdch是google倡导的一种压缩方式,目前...

    PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)

    如何减少流量,最方便的办法就是用Gzip压缩,这个apache的gzip压缩是靠一个叫做zlib的类库和gzip的模块(mod_gzip.c)完成的,这玩意专门有一帮牛人研究,因为gzip本身就大名鼎鼎的,并且具有高压缩率开源的压缩原理,...

    IIS启用页面Gzip压缩实现说明

    压缩的最大好处就是降低了网络传输的数据量,从而提高客户端浏览器的访问速度。 当然,同时也会增加一点点服务器的负担。Gzip是比较常见的一种HTTP压缩算法。本文介绍的HTTP压缩方式,采用的是Windows系统设置的...

    只要5分: AS3.0 在线录音并上传,转码MP3,二次压缩上传,带播放功能

    MP3数据的传输是gzip压缩的,服务器端存了压缩和不压缩的版本。 这个flash还带播放功能,能播放压缩和没有压缩过的mp3。 使用方法见rec.php;支持ie,ff,chrome,safari。 只要5分,超值,其它的都要10分!!

    Android GZip的使用-开发中网络请求的压缩实例详解

    当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据。 从Http 技术细节上讲,就是 http request 头中 有 “Accept-Encoding”, “gzip” ,response 中就有返回头Content-Encoding=gzip 我们现在从浏览器...

Global site tag (gtag.js) - Google Analytics