这几天在看一些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都非常的方便。