Servlet中FilterChain的doFilter()方法的作用

问题如下:

我想要通过ResponseWrapper来对response进行包装,达到对response中部分
文字的屏蔽,就比如原有的response中含有“赌博”二字的话,经过过滤器后会
被转换成****!

首先我创建了一个ResponseReplaceWrapper继承自HttpServletResponse
Wrapper类,代码如下:

图片说明

然后我在自定义的过滤器里面创建了这个ResponseReplaceWrapper对象,下面是我的代码:

图片说明

结果我测试了,原本在response中的内容,经过chain.doFilter(resquest,resp)之后,我自己创建的resp中的charWriter缓冲区也有了,我想问的就是,这doFIilter的作用到底是什么,貌似包含了将response中的内容自动转移到resp的charWriter的作用,其次,HttpServletResponse不能缓存输出内容这句话的含义是什么?

结束当前拦截器,进入chain拦截器链中的下一个拦截器。

* Causes the next filter in the chain to be invoked, or if the calling filter is the last filter
*  in the chain, causes the resource at the end of the chain to be invoked.

比如说我有三个filter如下

package org.bg.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "*")
public class FirstFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException {
        System.out.println("FirstFilter before");
        chain.doFilter(request, response);
        System.out.println("FirstFilter after");
    }
}

最后执行结果是:

FirstFilter before
SecondFilter before
ThreeFilter before
ThreeFilter after
SecondFilter after
FirstFilter after

我来补充chain.doFilter的作用是执行链中下一个filter的doFilter方法,上面的执行步骤是输出 XXXFilter before后在输出XXXFilter after前,
执行了chain.doFilter
因此会进入下一个filter的doFilter方法,以此类推,当执行到最后一个拦截器的doFilter方法时,输出XXXFilter before后执行chain.doFilter,
因为没有下一个了,所以就会往下执行 输出XXXFilter after,然后返回上一个拦截器执行chain.doFilter后的内容,所以FirstFilter after是后输出的