一、从web.xml到Spring容器
我们在使用spring配置shiro时,有两处需要配置Filter相关的地方:
<!-- Shiro配置 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Shiro的Web过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 调用我们配置的权限管理器 -->
<property name="securityManager" ref="securityManager"/>
<!-- 配置我们的登录请求地址 -->
<property name="loginUrl" value="/static/login.html"/>
<!--<property name="loginUrl" value="/common/login"/>-->
<!-- 配置我们在登录页登录成功后的跳转地址,如果你访问的是非/login地址,则跳到您访问的地址 -->
<property name="successUrl" value="/common/route"/>
<!-- 如果您请求的资源不再您的权限范围,则跳转到/403请求地址 -->
<property name="unauthorizedUrl" value="/common/403"/>
<property name="filters">
<map>
<entry key="ownauthc">
<!--自定义过滤器,方便ajax交互-->
<!--<ref bean="formAuthenticationFilter"/>-->
<ref bean="ownRoleAuthorizationFilter"></ref>
</entry>
</map>
</property>
<!-- 权限配置 -->
<property name="filterChainDefinitions">
<value>
<!--/common/doLogin/user=ownauthc-->
/common/**=anon
/search/**=anon
/static/superAdmin/**=roles[superadmin]
/static/admin/**=roles[admin]
/static/** = anon
</value>
</property>
</bean>
其实真正发挥拦截器作用的只有Spring中配置的ShiroFilterFactoryBean,而web.xml中配置的拦截器DelegatingFilterProxy功能相当于是为Spring中的Filter做了一层包装, DelegatingFilterProxy相关的源码如下:
@Override
protected void initFilterBean() throws ServletException {
synchronized (this.