java web servlet 过滤器filter与过滤器链filterchain的执行过程分析与验证 (一)

2014-11-24 10:16:41 · 作者: · 浏览: 0
[java]
涉及的类:filterweb.tony.filter.Filter1,filterweb.tony.filter.Filter2。对应的filter名分别为:filter1,filter2。类代码见文章最后
1、在web服务器启动时会加载web.xml中配置的所有filter。验证:
开启tomcat服务器后提示
信息: Deploying web application directory F:\MTony\Workspaces\MyEclipse Professional\.metadata\.me_tcat7\webapps\filterwebFilter1.initFilter2.init
2、filter链的形成:
当请求一个资源时,服务器会查询web.xml中所有对此资源路径进行过滤的filter,并根据在web.xml中的先后顺序形成一个filter链(filterchain)
(1)根据在web.xml中的先后顺序形成一个filter链。验证
[html]
filter2
filterweb.tony.filter.Filter2
filter2
/*
filter1
filterweb.tony.filter.Filter1
filter1
/*
filter2
filterweb.tony.filter.Filter2
filter2
/*
filter1
filterweb.tony.filter.Filter1
filter1
/*
浏览器中请求http://127.0.0.1:9090//filterweb/index. jsp,服务器发现web.xml中filter1和filter2都会对此路径过滤,按照顺序形成filterchain:filter2----->filter1。控制台输出信息:
[plain]
Filter2.doFilter.前
Filter1.doFilter.前
Filter1.doFilter.后
Filter2.doFilter.后
Filter2.doFilter.前
Filter1.doFilter.前
Filter1.doFilter.后
Filter2.doFilter.后
将web.xml中filter的顺序反过来
[ html]
filter1
filterweb.tony.filter.Filter1
filter1
/*
filter2
filterweb.tony.filter.Filter2
filter2
/*
filter1
filterweb.tony.filter.Filter1
filter1
/*
filter2
filterweb.tony.filter.Filter2
filter2
/*
浏览器中请求http://127.0.0.1:9090//filterweb/index.jsp,服务器发现web.xml中filter1和filter2都会对此路径过滤,按照顺序形成filterchain:filter2----->filter1。控制台输出信息:
[plain]
Filter1.doFilter.前
Filter2.doFilter.前
Filter2.doFilter.后
Filter1.doFilter.后
Filter1.doFilter.前
Filter2.doFilter.前
Filter2.doFilter.后
Filter1.doFilter.后
(2)根据请求的资源路径选择filter。例如现在将filter1的过滤路径设置为/common/*,即common下的所有资源。
[html]
filter1
filterweb.tony.filter.Filter1
filter1
/common/*
filter1
filterweb.tony.filter.Filter1
filter1
/common/*
并在common目录下新建一个common_index.jsp。
浏览器中请求http://127.0.0.1:9090//filterweb/index.jsp,服务器发现web.xml中只有filter2会对此路径过滤。控制台输出信息
[plain]
Filter2.doFilter.前
Filter2.doFilter.后
Filter2.doFilter.前
Filter2.doFilter.后浏览器中请求http://127.0.0.1:9090//filterweb/common/common_index.jsp,服务器发现web.xml中filter1和filter2会对此路径过滤。控制台输出信息
[plain]
Filter2.doFilter.前
Filter1.doFilter.前
Filter1.doFilter.后
Filter2.doFilter.后
Filter2.doFilter.前
Filter1.doFilter.前
Filter1.doFilter.后
Filter2.doFilter.后
(3)执行顺序:【filter1的dofilter()前------>filter1的dofilter()】======>【filter2的dofilter()前------>filter2的dofilter()------>filter2的dofilter()后】======>【filter1的dofilter()后】
\
可以从(1)的结果中看出来
filterweb.tony.filter.Filter1.java
[java]
packag