Filter包装response,重写response的getWriter方法实现网络数据压缩

第一步:开发一个Servlet输出数据

Filter包装response,重写response的getWriter方法实现网络数据压缩_第1张图片;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TwoServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //声明响应的头
  response.setContentType("text/html;charset=UTF-8");
  //获取输出对象
       PrintWriter out = response.getWriter();
       //输出数据
       String str = "Helloas等奖搜阿kasjfl";
       out.print(str);
 }
}

第二步:开发一个过滤器,拦截TwoServlet(包装response,重写getwriter方法)

Filter包装response,重写response的getWriter方法实现网络数据压缩_第2张图片

Filter包装response,重写response的getWriter方法实现网络数据压缩_第3张图片

Filter包装response,重写response的getWriter方法实现网络数据压缩_第4张图片

Filter包装response,重写response的getWriter方法实现网络数据压缩_第5张图片

package czb.filter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class TwoFilter implements Filter {
 public void destroy() {
 }
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  //对response进行包装
  MyRespose resp = new MyRespose((HttpServletResponse)response);
  //放行,让Servlet输出数据,结果输出的数据保存到了bout(缓存)对象中
  chain.doFilter(request, resp);
  //在chain.doFilter后面的代码,即Servlet已经执行完了
  //就可以获取放到缓冲中的数据
  byte[] src= resp.getSrc();
  System.err.println("原数据的大小为:"+src.length);
  //一下开始对数据进行压缩
  ByteArrayOutputStream bout = new ByteArrayOutputStream();//声明压缩后的容器
  GZIPOutputStream zip = new GZIPOutputStream(bout);//声明压缩工具流
  zip.write(src);
  zip.close();
  //获取压缩后的数据
  byte [] dest = bout.toByteArray();
  System.err.println("压缩后的数据大小:"+dest.length);
  //输出数据,使用原生的response
  HttpServletResponse hresp =(HttpServletResponse) response;
  hresp.setContentType("text/html;charset=UTF-8");
  hresp.setHeader("Content-encoding", "gzip");
     //获取字节输出流
  OutputStream out = hresp.getOutputStream();
  out.write(dest);
 }
 public void init(FilterConfig fConfig) throws ServletException {
 }
}
//声明一个response的包装类,重写它的getWriter方法
class MyRespose extends HttpServletResponseWrapper{
 //声明缓存,字节io缓冲块
 private ByteArrayOutputStream bout;
 PrintWriter out;
 public MyRespose(HttpServletResponse response) {
  super(response);
 }
 @Override
 public PrintWriter getWriter() throws IOException {
  bout  = new ByteArrayOutputStream();
  //由于super.getWriter();方法返回的是apache的writer对象
  //而apache的writer对象则是向浏览器返回数据,则可自己声明一个printwriter对象
  out = new PrintWriter(bout);//写入的缓存中
  return out;
 }
 //提供一个方法用于获取缓存中的数据
 public byte[] getSrc(){
  if(out!=null){
   out.close();//获取值后要关,要不缓冲中的数据拿不出来,tomcat的人家自己管理的
  }
  return bout.toByteArray();
 }
}

你可能感兴趣的:(Filter包装response,重写response的getWriter方法实现网络数据压缩)