废话不多说...,直接上代码:
filter中的的代码:
public class GZipFilter2 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 2.声明包装类, 并传递
MyResponse2 resp = new MyResponse2((HttpServletResponse) response);
chain.doFilter(request, resp);
// 3.关闭printWriter流 --> 这时候内存中已经存在了数据
resp.close();
// 4.对数据进行压缩
// 4>1 声明压缩流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
// 4>2 对数据进行压缩
gzipOutputStream.write(resp.getData());
// 4>3 关闭压缩流
gzipOutputStream.close();
// 4>4 获得压缩后的数据
byte[] data = byteArrayOutputStream.toByteArray();
System.out.println("压缩前的数据" + resp.getData().length);
System.out.println("压缩后的数据" + data.length);
// 5.使用原始的response将压缩后的数据,写入到页面中
// 5>1 设置头信息
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setContentType("text/html;charset=utf-8");
httpServletResponse.setHeader("Content-Encoding", "gzip");
httpServletResponse.setContentLength(data.length);
// 5>2 设置显示数据
ServletOutputStream output = httpServletResponse.getOutputStream();
output.write(data);
output.close();
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
// 1.创建包装响应类
class MyResponse2 extends HttpServletResponseWrapper{
private ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
private PrintWriter printWriter;
// 1>1 建立包装关系
public MyResponse2(HttpServletResponse response) {
super(response);
}
//1>2 重写getWriter()方法
@Override
public PrintWriter getWriter() throws IOException {
// 缓存成员变量
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, "UTF-8"));
this.printWriter = printWriter;
return printWriter;
}
// 从写getOutPutStream()方法
@Override
public ServletOutputStream getOutputStream() throws IOException {
ServletOutputStream outputStream = new ServletOutputStream(){
@Override
public void write(int b) throws IOException {
byteArrayOutputStream.write(b);
}
};
return super.getOutputStream();
}
// 1>3 缓存printerWriter,提供关闭方法
public void close() {
printWriter.close();
}
// 1>4 缓存bytebyteArrayOutputStream,并提供一个获得内部数据方法
public byte[] getData() {
return byteArrayOutputStream.toByteArray();
}
}
web描述文件web.xml:
GZipFilter2
com.jing.filter.GZipFilter2
GZipFilter2
*.jsp
*.do