测试三
直接看下面的代码。我们已经知道了”准备放行“会被打印在控制台上和test.jsp页面也能被访问得到,但“放行完成“会不会打印在控制台上呢?
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("准备放行"); //执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源) chain.doFilter(req, resp); System.out.println("放行完成"); }
答案也非常简单,肯定会打印在控制台上的。我们来看看:
注意,它的完整流程顺序是这样的:客户端发送http请求到Web服务器上,Web服务器执行过滤器,执行到”准备放行“时,就把字符串输出到控制台上,接着执行doFilter()方法,Web服务器发现没有过滤器了,就执行目标资源(也就是test.jsp)。目标资源执行完后,回到过滤器上,继续执行代码,然后输出”放行完成“
测试四
我们再多加一个过滤器,看看执行顺序。
- 过滤器1
System.out.println("过滤器1开始执行"); //执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源) chain.doFilter(req, resp); System.out.println("过滤器1开始完毕");
过滤器2
System.out.println("过滤器2开始执行"); chain.doFilter(req, resp); System.out.println("过滤器2开始完毕");
Servlet
System.out.println("我是Servlet1");
当我们访问Servlet1的时候,看看控制台会出现什么:
执行顺序是这样的:先执行FilterDemo1,放行,执行FilterDemo2,放行,执行Servlet1,Servlet1执行完回到FilterDemo2上,FilterDemo2执行完毕后,回到FilterDemo1上
注意:过滤器之间的执行顺序看在web.xml文件中mapping的先后顺序的,如果放在前面就先执行,放在后面就后执行!如果是通过注解的方式配置,就比较urlPatterns的字符串优先级
Filter简单应用
- filter的三种典型应用:
- 1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法,即是否让目标资源执行
- 2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
- 3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能