概述
第一步:开发一个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方法实现网络数据压缩所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复