filter拦截修改response

时间:2025-03-20 07:36:11
Filter 先拦截request, doFilter放行, response响应回来, Filter再次拦截 ,执行doFilter()后面的代码
执行过程:
发出request请求,服务器封装request对象,filter拦截request对象,在filter里面可以拿到前台传递过来的数据,使用装饰着模式,编写MyRequest类继承 HttpServletRequestWrapper.在MyRequest重写getParmater()方法--后台正式通过该方法拿request的数据。new 一个MyRequest对象传递给后台。
其实后台最终 通过MyRequest对象 调用它getParmater,拿到的是已经修改过的数据


在doFilter放行,封装一个假的response,也就是放行的是MyResponse对象,该对象里面重写writer方法,writer方法返回 printwriter(缓冲区) ,也就是返回一个打印流对象,并且指定向哪个缓冲区存放数据。
最终后台,把数据放到了MyResponse对象中早就定义好的缓冲区中。在Filter里面,拿到缓冲区的内容,进行编辑,把编辑后的内容  再通过正真的 ().writer()写到页面去。


public class ResponseWrapper extends HttpServletResponseWrapper {
    private PrintWriter cachedWriter;//定义打印流,servlet里拿到后,数据通过它存到缓冲区
    private CharArrayWriter bufferedWriter;//缓冲区,用来存放后台数据


       public ResponseWrapper(HttpServletResponse response) {
        super(response);
        bufferedWriter = new CharArrayWriter();
        cachedWriter = new PrintWriter(bufferedWriter);
    }


    @Override
    public PrintWriter getWriter() throws IOException {
        return cachedWriter;
    }


       public String getResult() {
        byte[] bytes = ().getBytes();
        try {
            return new String(bytes, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return "";
        }
    }
}
################################################################
#
#################################################################
通过过滤器拦截Response对象,然后就可以对输出流进行操作了。


复制代码
public class ResponseFilter implements Filter {
    @Override
    public void init( filterConfig) throws ServletException {


    }


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //设置假response 里面有缓冲区,假的writer
ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse) response);
        (request, wrapper);//分界线,request拦截执行从这往前的代码,resposne拦截执行该行之后的代码
       //后台已经把数据封装到缓冲区中,这里是取出来
String result = ();
//后台数据编辑后,通过真正的response写到前台页面去
        ().write(());
    }


    @Override
    public void destroy() {


    }
}
复制代码