gzip压缩

现在主流浏览器都是支持gzip的。服务器压缩网页后进行传输,可减少传输数据的大小使用户感觉访问速度更快。

当然,压缩也会消耗一部分服务器处理时间。 用Filter实现对返回信息的压缩

 

1个配置(web.xml)+3个class(核心:GZipFilter.java),不需要配置tomcat的server.xml,

 

配置web.xml

<filter>

<filter-name>GZipFilter</filter-name>

<filter-class>com..GZipFilter(全路径)</filter-class>

</filter>

<filter-mapping>

<filter-name>GZipFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

GZipStream.java

import java.io.IOException;  
import java.io.OutputStream;  
import java.util.zip.GZIPOutputStream;  
import javax.servlet.ServletOutputStream;  
  
public class GZipStream extends ServletOutputStream {  
  
  private GZIPOutputStream zipStream;  
  
  public GZipStream(OutputStream out) throws IOException {  
    zipStream = new GZIPOutputStream(out);  
  }  
  
  @Override  
  public void flush() throws IOException {  
    zipStream.flush();  
  }  
  
  @Override  
  public void write(byte[] b, int off, int len) throws IOException {  
    zipStream.write(b, off, len);  
  }  
  
  @Override  
  public void write(byte[] b) throws IOException {  
    zipStream.write(b);  
  }  
  
  @Override  
  public void write(int arg0) throws IOException {  
    zipStream.write(arg0);  
  }  
  
  public void finish() throws IOException {  
    zipStream.finish();  
  }  
  
  public void close() throws IOException {  
    zipStream.close();  
  }  
  
}

GZipResponse.java

import java.io.IOException;  
import java.io.OutputStreamWriter;  
import java.io.PrintWriter;  
  
import javax.servlet.ServletOutputStream;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpServletResponseWrapper;  
  
public class GZipResponse extends HttpServletResponseWrapper {  
  private GZipStream stream;  
  private PrintWriter writer;  
  public GZipResponse(HttpServletResponse response) throws IOException{  
    super(response);  
    stream=new GZipStream(response.getOutputStream());  
  }  
    
  @Override  
  public ServletOutputStream getOutputStream() throws IOException {  
    return stream;  
  }  
  
  @Override  
  public PrintWriter getWriter() throws IOException {  
    if (writer == null) {  
      writer = new PrintWriter(new OutputStreamWriter(  
          getOutputStream(), getCharacterEncoding()));  
    }  
    return writer;  
  }  
  
  public void flush() throws IOException {  
    if (writer != null) {  
      writer.flush();  
    }  
    stream.finish();  
  }  
  
}

 

GZipFilter.java

import java.io.IOException;  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
public class GZipFilter implements Filter {  
  
  public void destroy() {  
  }  
  
  public void init(FilterConfig fConfig) throws ServletException {  
  }  
  
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)   
  throws IOException, ServletException {  
    HttpServletRequest req=(HttpServletRequest)request;  
    HttpServletResponse res=(HttpServletResponse)response;  
    if(isGZipEncoding(req)){  
      GZipResponse zipResponse=new GZipResponse(res);  
      res.setHeader("Content-Encoding", "gzip");  
      chain.doFilter(request, zipResponse);  
      zipResponse.flush();  
    } else {  
      chain.doFilter(request, response);  
    }  
  }  
    
  /** 
   * 判断浏览器是否支持GZIP 
   * @param request 
   * @return 
   */  
  private static boolean isGZipEncoding(HttpServletRequest request){  
    boolean flag=false;  
    String encoding=request.getHeader("Accept-Encoding");  
    if(encoding.indexOf("gzip")!=-1){  
      flag=true;  
    }  
    return flag;  
  }  
  
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

本地测试的时候要注意TTFB的时间影响

压缩方式有很多种,

reference:JSP Filter,GZIP压缩响应流,https://www.cnblogs.com/zfswff/archive/2014/01/06/3507994.html

几种压缩算法的压缩和速度比较 LZ4太快了,https://blog.csdn.net/leilonghao/article/details/73200859

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值