我是靠谱客的博主 健康蜗牛,最近开发中收集的这篇文章主要介绍Filter包装response,重写response的getWriter方法实现网络数据压缩,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

;
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方法)

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方法实现网络数据压缩的全部内容,希望文章能够帮你解决Filter包装response,重写response的getWriter方法实现网络数据压缩所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部