package cn.lnu.web.filter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
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;
import cn.lnu.web.filter.GzipFilter.MyServletOutputStream;
public class WebCacheFilter implements Filter {
private Map<String,byte[]> map=new HashMap();//��ס�������ݵ�map����
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
//1���õ��û���������ʵ���Դ��uri����������uri=/Servlet_filter_words/servlet/ServletDemo4
String uri=request.getRequestURI();
System.out.println("uri="+uri);
//2,��map�������Ƿ��˸���Դ������
byte b[]=map.get(uri);
//3�����������(��ʾ���ǵ�һ�η��ʣ�ֱ���õ�����)����ֱ��ȡ�����ݴ�������
if(b!=null){
response.getOutputStream().write(b);
return;
}
//4,���û�б�������(˵���ǵ�һ�η���)���������Ŀ����Դִ�У���ʱ����Ҫдһ��response�İ�װ�࣬����Ŀ����Դ�����
MyResponse myresponse=new MyResponse(response);
chain.doFilter(request, myresponse);
byte data[]=myresponse.getBuffer();
//5,����ԴuriΪ�ؼ��֣�����Դ�����ݱ��浽map�����У��Ա��´η���
map.put(uri, data);
//6��������ݸ������
response.getOutputStream().write(data);
}
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
}
}