response保存了请求的返回信息,里面有个outputstream,你要返回给页面的流,都在这个地方保存. 
之前遇到一个问题,想把outputstream修改一下.因为这是个输出流,想要改这个里面的东西不是这么简单的. 
sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类的子类把servletresponse包装一下,在过滤器中使用,就可以去除response的文件流,对其作出修改.给出一个实现: 
Java代码  
  1. package com.ali.report.birt.filter;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.OutputStreamWriter;  
  6. import java.io.PrintWriter;  
  7. import java.io.UnsupportedEncodingException;  
  8.   
  9. import javax.servlet.ServletOutputStream;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. import javax.servlet.http.HttpServletResponseWrapper;  
  12.   
  13. public class CharResponseWrapper extends HttpServletResponseWrapper {  
  14.     private ByteArrayOutputStream buffer=null;      
  15.     private ServletOutputStream out=null;      
  16.     private PrintWriter writer=null;      
  17.           
  18.     public CharResponseWrapper(HttpServletResponse resp) throws IOException{      
  19.         super(resp);      
  20.         buffer=new ByteArrayOutputStream();//真正存储数据的流      
  21.         out=new WapperedOutputStream(buffer);      
  22.         writer=new PrintWriter(new OutputStreamWriter(buffer,this.getCharacterEncoding()));      
  23.     }      
  24.     //重载父类获取outputstream的方法      
  25.     @Override     
  26.     public ServletOutputStream getOutputStream()throws IOException{      
  27.         return out;      
  28.     }      
  29.     //重载父类获取writer的方法      
  30.     @Override     
  31.     public PrintWriter getWriter() throws UnsupportedEncodingException{      
  32.         return writer;      
  33.     }      
  34.     //重载父类获取flushBuffer的方法      
  35.     @Override     
  36.     public void flushBuffer()throws IOException{      
  37.         if(out!=null){      
  38.             out.flush();      
  39.         }      
  40.         if(writer!=null){      
  41.             writer.flush();      
  42.         }      
  43.     }      
  44.     @Override     
  45.     public void reset(){      
  46.         buffer.reset();      
  47.     }      
  48.     public String getContent()throws IOException{      
  49.         flushBuffer();//将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据      
  50.         return new String(buffer.toByteArray());      
  51.     }      
  52.           
  53.     //内部类,对ServletOutputStream进行包装      
  54.     private class WapperedOutputStream extends ServletOutputStream{      
  55.         private ByteArrayOutputStream bos=null;      
  56.         public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException{      
  57.             bos=stream;      
  58.         }      
  59.         @Override     
  60.         public void write(int b) throws IOException{      
  61.             bos.write(b);      
  62.         }      
  63.     }      
  64.   
  65. }  

然后在你的过滤器中这么使用: 
Java代码  
  1. public void doFilter(ServletRequest request, ServletResponse response,  
  2.             FilterChain chain) throws IOException, ServletException {  
  3.                       
  4.             CharResponseWrapper crw = new CharResponseWrapper((HttpServletResponse)response);  
  5.               
  6.             chain.doFilter(request, crw);  
  7.               
  8.             String content = crw.getContent();//response流的内容  
  9.               
  10.             //此处可以对content做处理,然后再把content写回到输出流中              
  11.             response.setContentLength(-1);  
  12.               
  13.             PrintWriter out = response.getWriter();  
  14.               
  15.             content = this.changeContent(content, sessionid, folder);  
  16.               
  17.             out.write(content);  
  18.               
  19.             out.flush();  
  20.   
  21.             out.close();*/  
  22.               
  23.                 }  

如此这般就可以达到你的目的了,当然扩展一下还是可以干很多事的,比如说压缩图片,改变字符集..........
09-18 10:51