自学-filterChainDefinitions的源码及和数据库进行交互-17

来源:互联网 发布:修改数据库时间 编辑:程序博客网 时间:2024/06/16 02:40

前几节我们应该对这个filterChainDefinitions 有了解了吧!我们所有的权限设置都配置在了这个org.apache.shiro.spring.web.ShiroFilterFactoryBean这个属性中,我们可以想下,现在是有这几个权限,那加入有很多呢,如果还配置在这里是不是不太方便了,开发就是能多简便我们就怎么写对吧,根据观察我们可以发现这个属性中的值是键值对的形式而且还是有序呢?那么这些我们会想到些什么呢?

值很多,我们是不是可以将这些放到数据库呢?键值对是不是会想到Map呢?有序会不会想到LinkedHashMap呢?为了验证我们的想的是正确的,那么我们就来打断点加编程来测试下吧。

使用Ctrl点进去看到源码是这样的:

public void setFilterChainDefinitions(String definitions) {        Ini ini = new Ini();        ini.load(definitions);        //did they explicitly state a 'urls' section?  Not necessary, but just in case:        Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);        if (CollectionUtils.isEmpty(section)) {            //no urls section.  Since this _is_ a urls chain definition property, just assume the            //default section contains only the definitions:            section = ini.getSection(Ini.DEFAULT_SECTION_NAME);        }        setFilterChainDefinitionMap(section);    }


在点击setFilterChainDefinitionMap进入:

public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {        this.filterChainDefinitionMap = filterChainDefinitionMap;    }
那么我们就在 
public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {        this.filterChainDefinitionMap = filterChainDefinitionMap;    }

打个断点吧:

一直走到这里可以看到:

可以看到使用LinkedHashMap存储的,那么我们就又有想法了,我们可以写一个方法,把这些值获取出来放入到Map中然后使用工厂bean的形式在xml中获取。

源码filterChainDefinitions 的类实现了FactoryBean.

写一个方法来存储键值对,为了测试我们就不建立数据库了,直接将值存储在map中:

FilterChainDefinitionMap.java:

package com.yiyi.subject;import java.util.LinkedHashMap;/** * 自定义FilterChainDefinitionMap  * */public class FilterChainDefinitionMap {/** * 由于在FilterChainDefinitionMap 中是需要顺序的,所以我们选择用LinkedHashMap */ public LinkedHashMap<String, String> getMap(){ LinkedHashMap< String , String> map=new LinkedHashMap<String, String>(); //将配置文件中的数据放到map 中。   map.put("/login.jsp", "anon"); map.put("/shiro/login", "anon"); map.put("/shiro/logout", "logout");  map.put("/admin.jsp", "roles[admin]"); map.put("/user.jsp", "roles[user]");  map.put("/**", "authc");   return map; }}

然后配置:

<!-- shiroFilter:web.xml中的name一致。否则报错 --><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="index.jsp" /><property name="unauthorizedUrl" value="unauthorized.jsp" /><!--anon:(anonymous) 拦截器表示匿名访问(即不需要录即可访问)authc:(authentication)拦截器表示需要身份认证通过后才能访问--><!--<property name="filterChainDefinitions"><value>/login.jsp = anon/shiro/login = anon/shiro/logout =logout/admin.jsp=roles[admin]/user.jsp=roles[user]# everything else requires authentication:/** = authc            </value></property>--><property name="filterChainDefinitionMap" ref="filter"></property></bean><!-- 工厂bean --><bean id="filter" factory-bean="filterChainDefinitionMap" factory-method="getMap"></bean><bean id="filterChainDefinitionMap" class="com.yiyi.subject.FilterChainDefinitionMap"></bean>

通过打断点测试,发现和之前的内容获取的也是一样的,所以说俩种方法都可以实现,这个相对权限多一点更加实用。


0 0
原创粉丝点击