全文內容轉載至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!所以配置中的順序不影響!