servlet压缩数据

<pre class="java" name="code"> 

新建一个servelt,用于输出数据
 
public class TestServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

		public void doPost(HttpServletRequest request, HttpServletResponse response)
				throws ServletException, IOException {
			request.setCharacterEncoding("utf-8");
			response.setContentType("text/html;charset=utf-8");
			
//			PrintWriter pw = response.getWriter();
//			pw.print("a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试");
//			pw.close();
			
			
			OutputStream out = response.getOutputStream();
			for (int i = 0; i < 50; i++) {
				out.write("你好真的谢谢".getBytes("utf-8"));
			}
			
		}

}


新建一个过滤器,用于过滤上面的servlet和jsp,代码如下

public class GZipFilter2 implements Filter {

	public void destroy() {
		
	}

	public void doFilter(ServletRequest request,
			ServletResponse response, FilterChain doChain)
			throws IOException, ServletException {
		HttpServletResponse resp = (HttpServletResponse) response;
		MyResponse2 myresp = new MyResponse2(resp);
		//将包装好的response传递到下一个servlet中
		doChain.doFilter(request, myresp);
		//读取原生数据
		byte[] src = myresp.getSrc();
		
		//开始压缩
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		GZIPOutputStream gzip = new GZIPOutputStream(out);
		gzip.write(src);
		gzip.close();
		
		//使用原生的response
		resp.setContentType("text/html;charset=UTF-8");
		byte[] desc = out.toByteArray();
		resp.setHeader("Content-Encoding", "gzip");
		resp.setContentLength(desc.length);
		resp.getOutputStream().write(desc);
		System.out.println("原来的数据:"+src.length);
		System.out.println("现在的数据:"+desc.length);
		
	}

	public void init(FilterConfig filterconfig) throws ServletException {
		
	}

}
//压缩数据,将数据存放到内存中
class MyResponse2 extends HttpServletResponseWrapper{
	//将这个容器声明为成员变量
	private ByteArrayOutputStream srcByte;
	private PrintWriter out ;
	public MyResponse2(HttpServletResponse response) {
		super(response);
	}
	@Override
	public PrintWriter getWriter() throws IOException {
		srcByte = new ByteArrayOutputStream();
		out = new PrintWriter(new OutputStreamWriter(srcByte,"utf-8"));
		return out;
	}
	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		srcByte = new ByteArrayOutputStream();
		ServletOutputStream out = new ServletOutputStream() {
			@Override
			public void write(int b) throws IOException {
				srcByte.write(b);
			}
		};
		return out;
	}
	//提供一个方法获取原生数据
	public byte[] getSrc(){
		if(out!=null){
			//如果不关闭的话,看不到数据
			out.close();
		}
		return srcByte.toByteArray();
	} 
} 


web.xml代码如下:

   <filter>
  	<filter-name>GZipFilter2</filter-name>
  	<filter-class>com.yxy.filter.GZipFilter2</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>GZipFilter2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值