在web.xml中配置了一个DelegatingFilterProxy的一个类。如下:
<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>
</filter>
这个类主要的功能是对我们在spring IOC容器中配置的bean name=shiroFilter 的实例进行代理。在下次我们如果要更换一个filter的时候不需要更改web.xml的代理。 之需要创建一个bean name和filter-name一致的filter即可。如果bean name不一直会报NoSuchBeanDefinitionException.
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="loginUrl" value="/login.html"></property>
<property name="successUrl" value="/success.html"></property>
<property name="unanthorizedUrl" value="/login.html"></property>
<property name="filterChainDefinitions">
<value>
/login.html=anon //匿名访问
/** =authc // 除了上面定义的权限为anon的页面,都需要授权才能访问。**表示匹配一个或者多则任意字符路径。 如/admin/**则匹配admin下任意的路径。 如果两个路径都匹配,则采取第一次匹配的过滤器 如/login.html符合 anon也匹配/** 不过是选择anon这个过滤器。
</value>
</property>
下面说一下DelegatingFilterProxy中的两个属性
1.targetBeanName (存储即将获取的核心过滤器的ID, 如果targetBeanName没有指定则返回filterName,如果指定则是指定的targetName)
如果web.xml中加入了 如下param-value等于abc。 则会到Spring IOC中查找是否有bean名字是abc的 。 如果没有配置targetBeanName则会找到这个filter的名字作为targetBeanName.
<init-param>
<param-name>targetBeanName</param-name>
<param-value>abc</param-value>
</init-param>
源码: if(this.targetBeanName=null){
this.targetBeanName=getFilterName(); // 直接调用上面我们在web.xml定义的<filter-name>shiroFilter</filter-name> 作为targetName;
}
2. delegate 获取spring中shiro的核心过滤器 (delegate委托)
initFilterBean方法:获取指定id值,如果没有指定,自动去寻找与filter-name一致的实例。并且再到IOC容器中找到相对应名字的bean实例,并且设置到delegate属性中。
总的来说这个初始化方法就是为了把servlet容器(web.xml)中的filter和Spring IOC(application-context.xml)中的bean实例进行关联,找到想对应的bean .