spring通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩包括AJAX)

Posted JEECG官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩包括AJAX)相关的知识,希望对你有一定的参考价值。

【spring】通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩、包括AJAX)


gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户端加载后渲染呈现,这种情况文件一般都比较大,如果开启Gzip ,那么服务器端响应后,会将页面,js,CSS等文本文件或者其他文件通过高压缩算法将其压缩,然后传输到客户端,由客户端的浏览器负责解压缩与呈现。通常能节省40%以上的流量(一般都有60%左右),一些PHP,JSP文件也能够进行压缩。


1、通过WEB服务器打开GZIP压缩服务

      目前大多数主流WEB中间件都支持GZIP压缩、下面以Tomcat 为例进行说明:

      找到Tomcat 目录下的conf下的server.xml,并找到如下信息

      <Connector port  =  "8080" maxHttpHeaderSize  =  "8192" maxThreads  =  "150" minSpareThreads  =  "25"               maxSpareThreads  =  "75" enableLookups  =  "false" redirectPort  =  "8443" acceptCount  =  "100"               connectionTimeout  =  "20000" disableUploadTimeout  =  "true"

      将它改成如下的形式(其实在上面代码的下面已经有了,将他们打开而已。):

       <Connector port="8080"  maxHttpHeaderSize="8192"  maxThreads="150" minSpareThreads="25"              maxSpareThreads="75"  enableLookups="false" redirectPort="8443" acceptCount="100"               connectionTimeout="20000" disableUploadTimeout="true"               compression="on"  compressionMinSize="2048"  noCompressionUserAgents="gozilla, traviata"               compressableMimeType="text/html,text/xml"  >

      这样,就能够对html和xml进行压缩了,如果要压缩css 和 js,那么需要将

           compressableMimeType=”text/html,text/xml”加入css和js:

           <Connector port="8080"  .........  compressableMimeType="text/html,text/xml,text/css,text/javascript"  >

      一般文本类型的静态文件可以通过这种方式压缩后传输、提高传输效率。

      已压缩过的静态文件(如图片)进行gzip压缩后大小基本无变化、所以一般不进行压缩。


2、通过过滤器实现gzip压缩

[java]  view plain  copy
  1. package com.tyyd.framework.web;  
  2.    
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletOutputStream;  
  10. import javax.servlet.ServletRequest;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. import org.apache.commons.io.FilenameUtils;  
  16. import org.apache.commons.lang.StringUtils;  
  17.   
  18. import com.tyyd.framework.core.AcwsInfo;  
  19. import com.tyyd.framework.core.AcwsMonitorLog;  
  20. import com.tyyd.framework.core.BufferedResponse;  
  21. import com.tyyd.framework.core.util.ZipUtil;  
  22.    
  23. /** 
  24.  * HTTP访问过滤器 
  25.  */  
  26. public class PageVisitFilter2 implements Filter   
  27.    
  28.     @Override  
  29.     public void init(FilterConfig filterConfig) throws ServletException   
  30.       
  31.    
  32.     @Override  
  33.     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException   
  34.         //性能监控  
  35.         long startTime = System.currentTimeMillis();  
  36.                   
  37.         HttpServletRequest request = (HttpServletRequest)req;  
  38.         HttpServletResponse response = (HttpServletResponse)res;  
  39.           
  40.         String uri = request.getRequestURI();  
  41.         String ext = FilenameUtils.getExtension(uri);  
  42.           
  43.         try  
  44.             response.setHeader("Pragma""No-cache");  
  45.             response.setHeader("Cache-Control""no-cache");  
  46.             response.setDateHeader("Expires", -1);  
  47.             request.setCharacterEncoding("UTF-8");  
  48.             response.setCharacterEncoding("UTF-8");  
  49.               
  50.             response.setHeader("renderer""webkit");   
  51.             response.setHeader("viewport""width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no");   
  52.       
  53.             if(isGZipEncoding(request))  
  54.                 //需要过滤的扩展名:.htm,.html,.jsp,.js,.ajax,.css  
  55.                 String gzippPattern=",.htm,.html,.jsp,.js,.ajax,.css,";  
  56.                 if(StringUtils.indexOf(gzippPattern, ",."+ext+",")!=-1)  
  57.                     BufferedResponse gzipResponse = new BufferedResponse(response);  
  58.                     chain.doFilter(request, gzipResponse);  
  59.                     byte[] srcData = gzipResponse.getResponseData();  
  60.                     byte[] outData = null;  
  61.                     if(srcData.length > 512)  
  62.                         byte[] gzipData = ZipUtil.toGzipBytes(srcData);  
  63.                         response.addHeader("Content-Encoding""gzip");  
  64.                         response.setContentLength(gzipData.length);  
  65.                         outData = gzipData;  
  66.                      else   
  67.                         outData = srcData;  
  68.                       
  69.                     ServletOutputStream output = response.getOutputStream();  
  70.                     output.write(outData);  
  71.                     output.flush();               
  72.                  else   
  73.                     chain.doFilter(request, response);  
  74.                   
  75.                 return;  
  76.               
  77.               
  78. Java如何在spring boot中启用gzip压缩并验证其生效

    使用Gzip压缩数据,加快页面访问速度

    网页启用Gzip压缩 提高浏览速度

    nginx的gzip压缩

    前端性能优化之Gzip

    nginx学习:nginx配置gzip