天天看點

spring filter的targetFilterLifecycle作用

在web.xml中進行配置,對所有的url請求進行過濾,就像"擊鼓傳花"一樣,鍊式處理。

配置分為兩種a和b。

a:普通配置

在web.xml中增加如下内容:

<filter>

    <filter-name>permissionfilter</filter-name>

    <filter-class>com.taobao.riskm.filter.permissionfilter</filter-class>

</filter>

<filter-mapping>

    <url-pattern>/*</url-pattern>

</filter-mapping>

由filter和filter-mapping構成。filter指定過濾器處理類(實作了filter接口),filter-mapping指定過濾的規則。

b:進階配置(允許代理注入spring bean)

    <filter-name>permission</filter-name>

    <filter-class>org.springframework.web.filter.delegatingfilterproxy</filter-class>

    <init-param>

        <param-name>targetfilterlifecycle</param-name>

        <param-value>true</param-value>

    </init-param>

 <filter-mapping>

    <url-pattern>*.htm</url-pattern>

在spring bean配置中加入:

 <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的另外一種配置方式:

        <param-name>targetbeanname</param-name>

        <param-value>spring-bean-name</param-value>

也就是增加一個"targetbeanname"的參數,值為實際執行filter的bean。

注意:filter和servlet都可以對url進行處理,filter是一個鍊式處理,隻要你想繼續處理就可以傳遞下去;而servlet則是一次處理并傳回!适合簡單邏輯處理。

附錄:

<url-pattern>可以選擇以下幾種形式

/*  所有資源

*.html  以html結尾的資源

/fold/* 指定目錄

/abc.html   指定檔案

以”/’開頭和以”/*”結尾的是用來做路徑映射的,

以字首”*.”開頭的是用來做擴充映射的。

為什麼定義”/*.action”這樣一個看起來很正常的比對會錯?

因為這個比對即屬于路徑映射,也屬于擴充映射,導緻容器無法判斷。

此外,filter就像"遞歸",在web.xml配置中的順序代表了filter的調用流程,而servlet被調用後不會繼續調用其他的servlet!是以配置中的順序不影響!

小結:工作之後才知道,每天可以積累的東西很多,但的确沒多少時間寫出來!了解一個東西需要花點時間,但寫出來就需要花更多的時間……寫出來的好處就不用多說了,希望以後多擠一些時間,好好沉澱下。

(全文完)