Filter是一个很有用的东西,使用filter可以修改request, response, session, application中的内容。
1. javax.servlet.Filter有两个重要的方法
public void init(FilterConfig config)
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
其中init方法用来作一些初始化的方法,而doFilter方法用来执行真正的过滤操作。
2. Filter的部署方法
在web.xml中要声明filter元素,并分配需要其处理的url,如下:
<filter>
<filter-name>Filter1</filter-name>
<filter-class>com.baidu.Filter1</filter-class>
</filter>
<filter>
<filter-name>Filter2</filter-name>
<filter-class>com.baidu.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Filter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. doFilter函数的执行顺序
当某个url请求匹配了多个Filter时,应用服务器将多个Filter组织成FilterChain,这个链的执行顺序是由其<filter-mapping>元素在web.xml文件中的顺序决定的。
doFilter函数可以过滤请求或者响应,当其过滤完请求后将调用FilterChain的doFilter函数让FilterChain中的下一个Filter来过滤请求。最先过滤请求的Filter将最后过滤相应,下面是个简单的例子。
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
system.out.println(“filter request here ----”);
// todo:
chain.doFilter(request,response);
system.out.println(“filter response here ----”);
// todo:
}
4.init函数的执行顺序
对于不同的应用服务器,Filter的init函数的执行时间是不同的,例如:tomcat会在tomcat启动的时候执行init函数,而weblogic等一些其他的应用服务器则会在该Filter匹配的url被首次请求的时候加载。
(下面的部分是我通过实验猜想的,不一定正确。)
对于tomcat而言,tomcat启动时会解析web.xml文件,然后按照<filter>元素的顺序将各个Filter元素加载到一个 HashMap中。解析完成后,会从HashMap中一个个的拿出Filter元素,串行的执行其init函数(这里的执行有先后关系,是在一个线程中执 行的)。所以在tomcat中定义的多个Filter其init函数的执行顺序就是其在HashMap中的散列顺序,具体来说与其在web.xml文件中 的定义位置及其名字有关。
对于HashMap来说,如果其元素固定不变,则其顺序也是固定不变的,但当元素个数发生变化时,便不能保证其顺序(例如:当有两个元素时,A在B的前面,当再加入20个元素的时候A就不一定在B的前面了),所以init函数的执行顺序是无法保证的。
posted on 2011-12-28 08:58
kxbin 阅读(5121)
评论(0) 编辑 收藏 所属分类:
J2EE