這幾天在看一些shrio的源碼,順便做一下筆記
1web.xml配置
<!-- 集成權限 start -->
<filter>
<filter-name>shiroFilter</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>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
這是集成shrio的基礎配置,這裏可以配置其他的一些security框架沒什麼可說的,下面開始說DelegatingFilterProxy這個代理類
2 先看一下DelegatingFilterProxy這個類的繼承關係
繼承自GenericFilterBean抽象類,這個抽象類又實現了filter接口
看到這裏大概知道DelegatingFilterProxy是個什麼東東了吧
3 由於DelegatingFilterProxy實現了filter接口所以會有init(),doChain(),destroy()這3個方法。
先看初始化init()方法…找了半天沒在DelegatingFilterProxy中找到這個方法,到父類一看原來在GenericFilterBean抽象類中實現了
init()方法中所做的工作就是將Filter包裝成spring的bean的形式,重要的是下面的this.initFilterBean();
this.initFilterBean()是在DelegatingFilterProxy代理類中實現的
這裏首先從web.xml文件中讀取出來shiroFilter的值,this.getFilterName()方法的實現以及
this.findWebApplicationContext()方法的實現,還有this.initDelegate(wac)方法的實現我分別貼出來
getFilterName:獲取filter的名稱即shiroFilter
findWebApplicationContext:獲取spring上下文對象
initDelegate:從spring上下文中獲取被代理的filter對象,即在spring-shrio.xml中配置id爲shrioFilter的bean
初始化完成
dofilter()方法
跟着源碼跑了一圈,總算知道DelegatingFilterProxy代理類在幹啥了.
DelegatingFilterProxy其實做的是代理類該做的事,如果沒有DelegatingFilterProxy類,spring想要集成shrio或者springManage安全框架無疑會變得很麻煩,需要在web.xml配置各種各樣的filter,這很明顯增加了兩者的耦合度。並且無法很好地體現spring的依賴注入原則,這就是代理類的優點。它將javaweb中的filter與spring中的bean整合到一起,通過spring來控制filter的生命週期。這樣無論是整合shrio還是springSecurity都非常的方便。