DelegatingFilterProxy詳解

全文內容轉載至spring DelegatingFilterProxy,targetFilterLifecycle的做用 ,我從新整理一下文章的結構java

今天在看SHIRO的時候,看到佟剛老師用了DelegatingFilterProxy類,並使用了targetFilterLifecycle和targetBeanName屬性,到網上找到了GOODDEEP先生的文章,受用很大。web

概要:spring

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

詳情:tomcat

使用兩種配置比較說明DelegatingFilterProxy配置的區別:服務器

配置一:app

在web.xml中增長以下內容:url

<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指定過濾的規則.net

配置二:代理

在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,優先被加載到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>Spring-bean-name</param-value>
    </init-param>
</filter>

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

相關文章
相關標籤/搜索