1.Filter代码:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
//全站压缩
public class GzipFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
GzipHttpServletResponse gresponse = new GzipHttpServletResponse(response);
chain.doFilter(request, gresponse);
//找一个缓冲字节流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//将数据压缩到字节流中
byte [] b = gresponse.getOldBytes();
GZIPOutputStream gouts = new GZIPOutputStream(baos);
System.out.println("压缩前的数据大小: "+b.length);
gouts.write(b);
gouts.close();
//从缓冲字节流中获取数据
b = baos.toByteArray();
System.out.println("压缩后的数据大小:"+b.length);
//一定要指定压缩方式
response.setHeader("Content-Encoding", "gzip");
//通知客户端大小
response.setContentLength(b.length);
ServletOutputStream out = response.getOutputStream();
out.write(b);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
class GzipHttpServletResponse extends HttpServletResponseWrapper
{
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private PrintWriter pw;
public GzipHttpServletResponse(HttpServletResponse response) {
super(response);
}
//字节流处理
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(baos);
}
//字符流处理
@Override
public PrintWriter getWriter() throws IOException {
//解决编码问题OutputStreamWriter
pw = new PrintWriter(new OutputStreamWriter(baos, super.getCharacterEncoding()));
return pw;
}
//返回baos中的数据
public byte[] getOldBytes()
{
try {
if(pw != null)
{
pw.close();
}
baos.flush();
} catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
}
class MyServletOutputStream extends ServletOutputStream
{
ByteArrayOutputStream baos;
public MyServletOutputStream(ByteArrayOutputStream baos)
{
this.baos = baos;
}
@Override
public void write(int b) throws IOException {
baos.write(b);
}
}
web.xml中配置
<!-- 压缩过滤器 -->
<filter>
<filter-name>GzipFilter</filter-name>
<filter-class>com.hhtc.filter.GzipFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>