java在过滤器中修改一个http请求的返回内容
response保存了请求的返回信息,里面有个outputstream,你要返回给页面的流,都在这个地方保存. 
sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类的子类把servletresponse包装一下,在过滤器中使用,就可以去除response的文件流,对其作出修改.首先要先子类化HttpServletResponseWrapper。
子类化HttpServletResponseWrapper
1、获取response对象,并将输出存放在自定义的流里面,那么关于输出流(outputStream、writer)的操作都是需要重写的了:
  1)以流的方式获取输出——重写getOutputStrem()
  2)以字符方式获取输出——重写getWriter()
  3)刷新流——重写flushBuffer()
  4)重置流——重写reset()
然后加入新增的获取输出数据的方法就ok了。
2、定义response包装器WapperedResponse继承HttpServletResponseWrapper   
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class ResponseWrapper extends HttpServletResponseWrapper {
    private PrintWriter cachedWriter;
    private CharArrayWriter bufferedWriter;
    private ServletOutputStream out=null;   
    public ResponseWrapper(HttpServletResponse response) throws IOException {
      super(response);
      // 这个是我们保存返回结果的地方
      bufferedWriter = new CharArrayWriter();
      out=new WapperedOutputStream(bufferedWriter);     
      // 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到bufferedWriter中
      cachedWriter = new PrintWriter(bufferedWriter);
    }
    //重载父类获取writer的方法 
    @Override
    public PrintWriter getWriter() throws UnsupportedEncodingException{
      return cachedWriter;
    }
    //重载父类获取outputstream的方法     
    @Override   
    public ServletOutputStream getOutputStream()throws IOException{     
        return out;     
    } 
    //重载父类获取flushBuffer的方法     
    @Override   
    public void flushBuffer()throws IOException{ 
        if(out!=null){     
            out.flush();     
        }
        if(cachedWriter!=null){     
            cachedWriter.flush();     
        }     
    }     
    @Override   
    public void reset(){     
        set();     
    } 
    /**
      * 获取原始的HTML页面内容。
      * @return
      */
    public String getResult() throws IOException{
        flushBuffer();
        String();
    }
    //内部类,对ServletOutputStream进行包装     
    private class WapperedOutputStream extends ServletOutputStream{      java stream
        private CharArrayWriter bos=null;     
        public WapperedOutputStream(CharArrayWriter stream) throws IOException{     
            bos=stream;     
        }     
        @Override   
        public void write(int b) throws IOException{     
            bos.write(b);     
        }     
    }     
}
然后在过滤器中使用,如下:
import java.io.IOException;
import java.io.PrintWriter;
import Matcher;
import Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class InitLabelParamSidFilter implements Filter{
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException
    {
        request.setCharacterEncoding("utf-8"); 
        PrintWriter out = null;
        try{
            // 使用我们自定义的响应包装器来包装原始的ServletResponse
              ResponseWrapper   wrapper =

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。