在web.xml中進行配置,對所有的URL請求進行過濾,就像"擊鼓傳花"一樣,鏈式處理。
配置分為兩種A和B。
1 在web.xml中增加如下內容: 2 <filter> 3 <filter-name>permissionFilter</filter-name> 4 <filter-class>com.taobao.riskm.filter.PermissionFilter</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>permissionFilter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping>10 由filter和filter-mapping構成。filter指定過濾器處理類(實現了Filter接口),filter-mapping指定過濾的規則。
B:高級配置(允許代理注入Spring bean)
1 在web.xml中增加如下內容: 2 <filter> 3 <filter-name>permission</filter-name> 4 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 5 <init-param> 6 <param-name>targetFilterLifecycle</param-name> 7 <param-value>true</param-value> 8 </init-param> 9 </filter>10 <filter-mapping>11 <filter-name>permission</filter-name>12 <url-pattern>*.htm</url-pattern>13 </filter-mapping>14 15 在spring bean配置中加入:16 <bean id="permission" class="com.taobao.kfc.kwb.web.permission.PermissionHttpServlet"></bean>
因為filter比bean先加載,也就是spring會先加載filter指定的類到container中,這樣filter中注入的spring bean就為null了。
解決辦法:先filter中加入DelegatingFilterProxy類,"targetFilterLifecycle"指明作用于filter的所有生命周期。原理是,DelegatingFilterProxy類是一個代理類,所有的請求都會首先發到這個filter代理,然后再按照"filter-name"委派到spring中的這個bean。
在Spring中配置的bean的name要和web.xml中的<filter-name>一樣.
此外,spring bean實現了Filter接口,但默認情況下,是由spring容器來管理其生命周期的(不是由tomcat這種服務器容器來管理)。如果設置"targetFilterLifecycle"為True,則spring來管理Filter.init()和Filter.destroy();若為false,則這兩個方法失效!!
B和A最大的不同是,A是一個filter,優先被加載到container中,無法調用spring中后續的bean;而B是一個spring bean,可以引用其他的bean,而請求都通過DelegatingFilterProxy類委派給B!
B的另外一種配置方式:
<filter> <filter-name>permission</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetBeanName</param-name> <param-value>Spring-bean-name</param-value> </init-param></filter>
也就是增加一個"targetBeanName"的參數,值為實際執行Filter的bean。
注意:Filter和servlet都可以對URL進行處理,Filter是一個鏈式處理,只要你想繼續處理就可以傳遞下去;而Servlet則是一次處理并返回!適合簡單邏輯處理。
附錄:<url-pattern>可以選擇以下幾種形式/* 所有資源*.html 以html結尾的資源/fold/* 指定目錄/abc.html 指定文件以”/’開頭和以”/*”結尾的是用來做路徑映射的,以前綴”*.”開頭的是用來做擴展映射的。為什么定義”/*.action”這樣一個看起來很正常的匹配會錯?因為這個匹配即屬于路徑映射,也屬于擴展映射,導致容器無法判斷。此外,filter就像"遞歸",在web.xml配置中的順序代表了filter的調用流程,而servlet被調用后不會繼續調用其他的servlet!因此配置中的順序不影響!
小結:工作之后才知道,每天可以積累的東西很多,但的確沒多少時間寫出來!理解一個東西需要花點時間,但寫出來就需要花更多的時間……寫出來的好處就不用多說了,希望以后多擠一些時間,好好沉淀下。
(全文完)
感謝原博主 原文路徑:http://blog.csdn.net/whuslei/article/details/8134848
新聞熱點
疑難解答