过滤器应用之全站压缩

全站压缩

现在的网络,流量就是钱。所以,如果能在很少的流量的情况下,查看相同的数据内容,那何乐而不为呢?

 
 
实现方案:
•用户在调用 response.getOutputStream()或 response.getWriter()时让获取自己的 输出流对像,我们将信息写到事先准备好的 缓存当中。
•当用户书写完毕,我们再调用自己提供的方法, 获取缓存中的数据流
然后接着对数据进行压缩,在过虑器中,将信息返回给用户,从而实现数据的压缩。
细节:

配置只对部分和.jsp压缩,其他的不压缩,还应配置对.js,.css压缩 但决不能配置对所有请求都压缩,因为如果用户请求的是下载,那不但不能压缩,反而会让 服务器因内存益处而崩溃。(下载,数据量通常很大,不能一次性把这些数据都输到内存流baout中,这样服务器的内存会不够的。而我们的压缩,就是一次性在后台把数据都写到baout中,然后在过滤器中再取出来压缩输出)

过滤器中的代码块(兼容字节压缩和字符压缩):

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
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.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class GzipFilter implements Filter {
    public GzipFilter() {
    }

	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
<span style="white-space:pre">		</span>//利用多态原理,用自己的类替换response
		MyRsponse resp = new MyRsponse((HttpServletResponse)response);
		chain.doFilter(request, resp);
		//从内存流中取出原字节
		ByteArrayOutputStream baos = resp.getBaos();
		byte src[] = baos.toByteArray();
		System.out.println("压缩前:"+src.length);
		//压缩
		baos = new ByteArrayOutputStream();
		GZIPOutputStream out = new GZIPOutputStream(baos);
		out.write(src);
		out.close();
		//写出去
		HttpServletResponse response2 = (HttpServletResponse)response;
		byte[] dest = baos.toByteArray();
		System.out.println("压缩后:"+dest.length);
		response2.setHeader("Content-Encoding","gzip");
		response2.setContentType("text/html;charset=utf-8");
		response2.setContentLength(dest.length);
		response2.getOutputStream().write(dest);
	}
	public void init(FilterConfig fConfig) throws ServletException {
	}
}

class MyRsponse extends HttpServletResponseWrapper{
	private ByteArrayOutputStream baos;
	private PrintWriter pw;
	public MyRsponse(HttpServletResponse response) {
		super(response);
		baos = new ByteArrayOutputStream();
		
	}
	
	
	public ByteArrayOutputStream getBaos() {
<span style="white-space:pre">		</span>//这一步很有必要,因为是引用传值
		if(pw!=null){
			pw.close();
		}
		return baos;
	}


	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		return new MyOutputStream(baos);
	}


	@Override
	public PrintWriter getWriter() throws IOException {
		pw =  new PrintWriter(new OutputStreamWriter(baos,"utf-8"),true);
		return pw;
	}
	
	
	
}

class MyOutputStream extends ServletOutputStream{
	private ByteArrayOutputStream baos;
	
	public MyOutputStream(ByteArrayOutputStream baos) {
		super();
		this.baos = baos;
	}

	@Override
	public void write(int b) throws IOException {
		baos.write(b);
	}
}

字节方式写出的Servlet:

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ByteGZIPServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String str = "网页压缩数据hncuhdncu网页压缩数据hncuh数据hncuhdncu网页" +
				"压缩数据hncuh数据hncuhdncu网页压缩数据hncuhdncu网页压缩数据hncu" +
				"hdncu";
		OutputStream out = response.getOutputStream();
		out.write(str.getBytes("utf-8"));
		out.close();
	}

}
字符方式写出的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 CharGZIPServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String str ="网页压缩数据hncuhdncu网页压缩数据hncuh数据hncuhdncu网页" +
				"压缩数据hncuh数据hncuhdncu网页压缩数据hncuhdncu网页压缩数据hncu" +
				"hdncu";
		PrintWriter out = response.getWriter();
		out.write(str);
		out.close();
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值