DelegatingFilterProxy(委派拦截代理)(五)
集成Spring在这篇文章中说到
ShiroFilter这个bean id必须和web.xml文件中配置的DelegatingFilterProxy的<filteName>一致
如果不一致会在项目启动的时候报错,因为Shiro会在IOC中查找名字对应的Bean
带你们涨涨见识(源码)
1.首先进去org.springframework.web.filter.DelegatingFilterProxy这个源码找到DelegatingFilterProxy.initDelegate(初始化)方法 ,找到之后打个断点启动项目看看
2.找见targetBeanName,如果Bean没有的话,他可不就会抛出异常吗?然后点进去targetBeanName
3.找见setTargetBeanName方法
DelegatingFilterProxy实际上是Filter 的一个代理对象,默认情况下Spring会到Ioc容器查找和filter-name 对应的那个Bean,也可以通过targetBeanName的初始化参数来配置filter-name 这个Bean的id
仅是测试,我想应该没人会闲的没事干去配置,这样启动项目也不会报错
applicationContext.xml
<bean id="abc" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/login.jsp"/>
<property name="successUrl" value="/list.jsp"/>
<property name="unauthorizedUrl" value="/unauthorizedUrl.jsp"/>
<property name="filterChainDefinitions">
<value>
/login.jsp=anon <!--表示这个页面不会拦截,其他页面访问的话回拦截并且拦截完会重定向到login.jsp-->
/**=authc <!--除了login.jsp页面之后任何页面访问都需要认证-->
</value>
</property>
</bean>
web.xml
<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>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>abc</param-value>
</init-param>
</filter>