package cn.lnu.web.filter;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
//ʵ��ȫվѹ���Ĺ�����,�����Ҫ��response������ǿ֮���ٷ���
public class GzipFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
MyResponse myresponse=new MyResponse(response);
chain.doFilter(request, myresponse);//response.getWriter��response.getOutputStream������������Ҫ��ǿ�����ƽ����ݶ�д��myresponse�е�һ���������У�����һ���Լ�����
//Ȼ��ȡ���������е����ݽ���ѹ������������
byte out[]=myresponse.getBuffer();
System.out.println("ѹ��֮ǰ��"+out.length);
byte gzipout[]=gzip(out);
System.out.println("ѹ��֮��"+gzipout.length);
response.setHeader("content-encoding", "gzip");
response.setHeader("content-length", gzipout.length+"");
response.getOutputStream().write(gzipout);
}
public byte[] gzip(byte b[]) throws IOException{//����һ��byte���飬����һ��gzipѹ��֮���byte����
ByteArrayOutputStream bout=new ByteArrayOutputStream();
GZIPOutputStream gout=new GZIPOutputStream(bout);
gout.write(b);//������д��bout��ȥ
gout.close();
return bout.toByteArray();
}
class MyResponse extends HttpServletResponseWrapper{
private ByteArrayOutputStream bout=new ByteArrayOutputStream();//ά��һ�������������ֽ����鱣�浽�������
private PrintWriter pw;
private HttpServletResponse response;
public MyResponse(HttpServletResponse response) {
super(response);
this.response=response;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(bout); //myresponse.getOutputStream.write("afhsaa");,�������ս�����bout��
}
@Override
public PrintWriter getWriter() throws IOException {
//pw=new PrintWriter(bout); //PrintWriter.Write("�й�")���ڲ���ȥ��gb2312���,�ij����淽ʽ,reponse���õ���ʲô��������Ϊʲô���
pw=new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding()));
return pw;//myresponse.getWriter().write("hdalhfahfa")��//���ַ������д��������̫С�����Ὣ����д���ײ㻺�����У�����ֱ��д��printWriter�Ļ����У�getBuffer()ʱ�ӵײ����о�ȡ��������
}
//�Զ��庯�����õ�bout�������е�����
public byte[] getBuffer(){
if(pw!=null){
pw.close();//ȷ��printwriter��ʽ����������̫С����д���ײ������ֶ�close֮������д���ײ���bout��ȥ
}
return bout.toByteArray();
}
}
//����һ�����࣬����������
class MyServletOutputStream extends ServletOutputStream{
private ByteArrayOutputStream bout;
public MyServletOutputStream(ByteArrayOutputStream bout){//����һ���������û�������д��������л�������
this.bout=bout;
}
@Override
public void write(int b) throws IOException {
// TODO Auto-generated method stub
bout.write(b);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void destroy() {
// TODO Auto-generated method stub
}
}