过滤器例子
<!--A过滤器-->
<filter> <filter-name>mdamptRightLimitFilter</filter-name> <filter-class> com.sgfm.datacenter.filter.ALimitFilter </filter-class> </filter> <filter-mapping> <filter-name>AFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
<!--B过滤器-->
<filter> <filter-name>BFilter</filter-name> <filter-class>com.sgfm.datacenter.filter.BFilter</filter-class> </filter> <filter-mapping> <filter-name>BFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
1.当web应用启动时候,就开始调用过滤器链中的所有init方法。初始化顺序 b->a,然后调用dofilter
public void init(FilterConfig filterConfig) { applicationContext = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext()); }
2.再 调用dofilter,不过只会调用 <url-pattern>/*</url-pattern> 的dofilter方法,为什么了,应为容器会将应用的上下问给去掉,只匹配/*的过滤器
当然这只是启动的时候
当在运行的时候,因为是过滤器链所以都会调用,只不过这时候调用的顺序就是先精确匹配,在通配符匹配
eg:调用的cc.do 会先调用 Afilter->Bfilter