Shiro学习笔记——工作流程与过滤器的配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012525096/article/details/82588183

工作流程

web.xml中配置了过滤器,整个访问请求都会被filter过滤

    <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>
    </filter-mapping>

而过滤器shiroFilter又有自己的过滤规则,具体配置在applicationContext.xml中,过滤器也是一个Bean,可以配置自己的规则。

    <bean id="shiroFilter" 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="/unauthorized.jsp"/>

        <!--  
                                配置哪些页面需要受保护. 
                                以及访问这些页面需要的权限. 
            1). anon 可以被匿名访问
            2). authc 必须认证(即登录)后才可能访问的页面. 
            3). logout 登出.
            4). roles 角色过滤器
        -->
        <property name="filterChainDefinitions">
            <value>
                /login.jsp = anon

                # everything else requires authentication:
                /** = authc
            </value>
        </property>
    </bean>

流程图

图片来自尚硅谷Shiro视频:

过滤器bean的配置

(1)web.xml中DelegatingFilterProxy<filter-name>的值需要与applecationContext.xml中的org.apache.shiro.spring.web.ShiroFilterFactoryBean的id值相同,若不相同,则会抛出NoSuchBeanDefinitionException异常,因为 Shiro会来IOC容器中查找和 <filter-name>名字对应的filter bean
(2)也可以通过DelegatingFilterProxy的初始化参数targetBeanName去指定bean的id。
如:
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>

applicationContext.xml:

<bean id="abc" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- ......... -->
</bean>

初始化参数的targetBeanName值为abc,bean的id也为abc,这样也可以正常启动和加载。

拦截器URL配置细节

格式:url = 拦截器[参数],拦截器[参数]
如果当前请求的url匹配[urls]部分的某个url模式,将会执行其配置的拦截器。
anon(anonymous)拦截器表示匿名访问(即不需要登录即可访问)
authc(authentication)拦截器表示需要身份认证通过后才能访问。

匹配模式

url模式使用Ant风格模式,注意通配符匹配不包括目录分隔符"/"
- ?:匹配一个字符:如/admin?,将会匹配/admin1,但不会匹配/admin(0个字符)或admin/(目录分隔符)
- *:匹配0个或多个字符串:如/admin*将匹配/admin /admin123,但不匹配/admin/1(目录分隔符和以后的字符)
- **:匹配路径中的0个或多个路径:如/admin/**将匹配/admin/a /admin/a/b
注意:URL权限采取第一次匹配优先的方式,即从头开始使用第一个匹配的url模式对应的拦截器链
如:

/bb/** = filter1
/bb/aa = filter2
/** = filter3

若请求为/bb/aa,则按照声明顺序进行匹配,将使用filter1进行拦截。

猜你喜欢

转载自blog.csdn.net/u012525096/article/details/82588183