java实现gzip

来源:互联网 发布:九阴真经捏脸数据 明星 编辑:程序博客网 时间:2024/06/05 17:11

package com.test;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.io.FilenameUtils;import org.apache.commons.lang.StringUtils;/** *  * @author LiMing * */@WebFilter("/MyFilter")public class MyFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest)req;          HttpServletResponse response = (HttpServletResponse)res;         //获取请求路径        String uri = request.getRequestURI();          //获取请求后缀 .js  .css  .do 。。。        String ext = FilenameUtils.getExtension(uri);                    try{          //设置想用头信息              //关于相应头属性意思可以看博客: http://blog.csdn.net/qq_36291682/article/details/71860958            response.setHeader("Pragma", "No-cache");              response.setHeader("Cache-Control", "no-cache");              response.setDateHeader("Expires", -1);              //设置相应编码信息            request.setCharacterEncoding("UTF-8");              response.setCharacterEncoding("UTF-8");              response.setHeader("renderer", "webkit");               response.setHeader("viewport", "width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0 user-scalable=no");                     if(isGZipEncoding(request)){                  //需要过滤的扩展名:.htm,.html,.jsp,.js,.ajax,.css                  String gzippPattern=",.htm,.html,.jsp,.js,.ajax,.css,.do,";                  //如果是需要gzip压缩的路径                if(StringUtils.indexOf(gzippPattern, ",."+ext+",")!=-1){                 //把response转换成gzipResponse                    BufferedResponse gzipResponse = new BufferedResponse(response);                      //doFilter 之后还会等待ServletOutputStream 返回数据                    chain.doFilter(request, gzipResponse);                      //获取源数据                    byte[] srcData = gzipResponse.getResponseData();                     //输出数据                    byte[] outData = null;                      //如果源数据的长度大于512                    if(srcData.length > 512){                     //gzip                        byte[] gzipData = ZipUtil.gZip(srcData);                          response.addHeader("Content-Encoding", "gzip");                          response.setContentLength(gzipData.length);                          //                        outData = gzipData;                      } else {                          outData = srcData;                      }                      ServletOutputStream output = response.getOutputStream();                      output.write(outData);                      output.flush();                      output.close();                } else {                      chain.doFilter(request, response);                  }                  return;              }                            chain.doFilter(request, response);          }catch(Exception e){            e.printStackTrace();        }finally{                   }  }/** * 判断浏览器是不是支持gzip *@author LiMing  E-mail:1151143484@qq.com *2017年5月13日  下午3:46:33 */    private boolean isGZipEncoding(HttpServletRequest request){        boolean flag=false;        String encoding=request.getHeader("Accept-Encoding");        //gzip, deflate, sdch      if(encoding.indexOf("gzip")!=-1){          flag=true;        }        return flag;      }         public void destroy() {}public void init(FilterConfig fConfig) throws ServletException {}}zipUtil.javapackage com.test;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.GZIPOutputStream;public class ZipUtil {/** * 压缩GZip *  * @param data * @return * @throws CustomizeException */public static byte[] gZip(byte[] data) {byte[] b = null;ByteArrayOutputStream bos = null;GZIPOutputStream gzip = null;try {bos = new ByteArrayOutputStream();gzip = new GZIPOutputStream(bos);gzip.write(data);gzip.finish();b = bos.toByteArray();} catch (IOException e) {e.printStackTrace();} finally {try {bos.close();gzip.close();} catch (IOException e) {e.printStackTrace();}}return b;}}


CSDN下载地址:http://download.csdn.net/detail/qq_36291682/9841687 


git下载地址 整个项目下载地址:http://git.oschina.net/shadow00/he

0 0
原创粉丝点击