spring-web下delegatingFilterProxy代理类研究笔记
这几天在看一些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都非常的方便。