Spring| DelegatingFilterProxy詳解

概要:
DelegatingFilterProxy類不是針對SHIRO出現的,是SHIRO的org.apache.shiro.spring.web.ShiroFilterFactoryBean 使用到了SPRING這個類提供功能。這個類使SPRING容器中的BEAN可以在WEB.XML中配置爲FILTER,並生效。這樣一來及起到了過濾URL請求作用,又可以訪問SPRING容器中其他的BEAN提供的豐富功能。


詳情:
使用兩種配置比較說明DelegatingFilterProxy配置的區別:
配置一:
在web.xml中增加如下內容:

<filter>
    <filter-name>permissionFilter</filter-name>
    <filter-class>com.taobao.riskm.filter.PermissionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>permissionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

由filter和filter-mapping構成。filter指定過濾器處理類(實現了Filter接口),filter-mapping指定過濾的規則
配置二:
在web.xml中增加如下內容:

<filter>
    <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>
 <filter-mapping>
    <filter-name>permission</filter-name>
    <url-pattern>*.htm</url-pattern>
</filter-mapping>

在spring bean配置中加入:

<bean id="permission" class="com.taobao.kfc.kwb.web.permission.PermissionHttpServlet"></bean>

DelegatingFilterProxy類是一個代理類,所有的請求都會首先發到這個filter代理,然後再按照"filter-name"委派到spring中的這個bean

	protected void invokeDelegate(
			Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		delegate.doFilter(request, response, filterChain);
	}

delegate爲org.apache.shiro.spring.web.ShiroFilterFactoryBean(發現並沒有實現Filter接口,但是內部有private Map<String, Filter> filters;)

配置二和配置一最大的不同是,配置一是一個filter,優先被加載到container中,無法調用spring中後續的bean;而配置二是一個spring bean,可以引用其他的bean,而請求都通過DelegatingFilterProxy類委派給B,具體實現爲:
“targetFilterLifecycle”:spring bean實現了Filter接口,但默認情況下,是由spring容器來管理其生命週期的(不是由tomcat這種服務器容器來管理)。如果設置"targetFilterLifecycle"爲True,則spring來管理Filter.init()和Filter.destroy();若爲false,則這兩個方法失效!!
“targetBeanName”:用來指定Spring配置文件中的beanName,就不再要求Spring配置文件中的beanName和web.xml中的filte-name一致了。

<filter>
    <filter-name>permission</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>permission</param-value>
    </init-param>
</filter>

另外:Filter和servlet都可以對URL進行處理,Filter是一個鏈式處理,只要你想繼續處理就可以傳遞下去;而Servlet則是一次處理並返回,適合簡單邏輯處理。filter就像"遞歸",在web.xml配置中的順序代表了filter的調用流程,而servlet被調用後不會繼續調用其他的servlet!因此配置中的順序不影響!


總結:
DelegatingFilterProxy默認是找配置的<filter-name>對應的Bean,如果配置了<param-name>targetBeanName</param-name>,則以配置的Bean名稱爲準,通過IOC容器查找該Bean.


參考:
https://blog.csdn.net/u013378306/article/details/50801001

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章