9Filter高级开发2--实现全站压缩

一.全站压缩式通过包装response来实现的。

 

二.

应用HttpServletResponseWrapper对象,压缩响应正文内容。思路:
1 通过filter向目标页面传递一个自定义的response对象;
     (1)在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
     (2)在我们自定义的ServletOuputStream对象中,重写write方法,使写出的数据写出到一个buffer中。
2.当页面完成输出后,在filter中就可得到页面写出的数据,从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,以此完成响应正文件压缩功能。
 
三、
//实现全站压缩  /*
public class GzipFilter implements Filter {

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
	
		HttpServletResponse response = (HttpServletResponse) resp;
		HttpServletRequest request = (HttpServletRequest) req;
		
		
		//用自己写的response捕获目标资源的输出
		MyResponse myresponse = new MyResponse(response);
		chain.doFilter(request, myresponse);
		
		byte data[] = myresponse.getBufferData();  //得到目标资源输出的数据
		System.out.println("原始数据的大小:" + data.length);
		
		gout(data,response);
		
		//byteOutputStream out;
		//servlet --->    myresponse.getOutputStream()--->MyServletOutputStream.write("hahha")
		//chain.doFilter(request, myresponse);
	}
	
	public void gout(byte data[],HttpServletResponse response) throws IOException{
		
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		GZIPOutputStream gout = new GZIPOutputStream(bout);  //buffer
		gout.write(data);
		gout.close();  //一定要有
		
		byte gzipdata[] = bout.toByteArray();
		
		response.setHeader("content-encoding", "gzip");
		response.setContentLength(gzipdata.length);
		response.getOutputStream().write(gzipdata);
		
	}
	
	class MyResponse extends HttpServletResponseWrapper{
		private HttpServletResponse response;
		private ByteArrayOutputStream bout = new ByteArrayOutputStream();
		private PrintWriter pw = null;
		
		
		public MyResponse(HttpServletResponse response) {
			super(response);
			this.response = response;
		}
		@Override
		public ServletOutputStream getOutputStream() throws IOException {
			return new MyServletOutputStream(bout);
		}
		
		@Override
		public PrintWriter getWriter() throws IOException {
			// TODO Auto-generated method stub
			pw = new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding()));  //write("中国")
			return pw;
		}
		public byte[] getBufferData(){
			if(pw!=null){
				pw.close();
			}
			if(bout!=null){
				return bout.toByteArray();
			}
			return null;
		}
		
	}
	
	class MyServletOutputStream extends ServletOutputStream{
		
		private ByteArrayOutputStream bout;
		public MyServletOutputStream(ByteArrayOutputStream bout){
			this.bout = bout;
		}
		
		@Override
		public void write(int b) throws IOException {  //hahah
			bout.write(b);
		}
		
	}
	
	public void destroy() {
		// TODO Auto-generated method stub

	}

	

	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

}

<filter>
  <filter-name>GzipFilter</filter-name> 
  <filter-class>cn.itcast.web.filter.example.GzipFilter</filter-class> 
</filter>
<filter-mapping>
  <filter-name>GzipFilter</filter-name> 
  <url-pattern>*.jsp</url-pattern> 
  <dispatcher>FORWARD</dispatcher> 
  <dispatcher>REQUEST</dispatcher> 
</filter-mapping>
<filter-mapping>
  <filter-name>GzipFilter</filter-name> 
  <url-pattern>*.css</url-pattern> 
</filter-mapping>
<filter-mapping>
  <filter-name>GzipFilter</filter-name> 
  <url-pattern>*.js</url-pattern> 
</filter-mapping>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值