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 .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@
*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.java

package 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;
}
}


 

git下载地址 整个项目下载地址