问题出处
当一个项目中出现两个或两个以上的filter时,就会产生此问题——哪个filter先执行、哪个后执行。
实践总结
filter的执行顺序和web.xml中filter-mapping的前后顺序一致,而与filter定义的先后无关。
举例,假如你的web.xml有如下配置片段:
<filter-mapping> <filter-name>SessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SystemFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
那么则实际运行中会先执行SessionFilter、后执行SystemFilter.
实践应用
在实际项目中,多见的是在使用struts框架+filter过滤时(如果你没有使用filter而是struts的intercepter,不在此文讨论范围内),比如有如下结构:
* StrutsPrepareAndExecuteFilter - 负责调度action
* SessionFilter - 负责用户登录审查
大家知道struts对web应用的侵入就是靠它的一个filter(StrutsPrepareAndExecuteFilter)来完成的,而此时我们另外有SessionFilter来过滤非法用户对action的访问。
显然我们期望的顺序是:首先过滤非法用户对action的访问,其后在根据请求地址调度相应的action或jsp.
但是如果此时不注意filter顺序,常常会遇到意想不到的问题,而解决办法就是按照正确的顺序在web.xml中定义:
<filter-mapping> <filter-name>SessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>StrutsPrepareAndExecuteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>