shiro--我的剖析

ehcache.xml是配置缓存的文件
ehcache.xml只被spring-shiro.xml引用了
ehcache是spring框架自带的一个缓存插件 class=“org.springframework.cache.ehcache.EhCacheManagerFactoryBean”>
com.zealfi.zxbFamilyInfo.mgmt.shiro.RetryLimitSimpleCredentialsMatcher:关于password的处理,涉及到了token

1.shiro的配置文件的结构图:
在这里插入图片描述

shiro部分xml配置:

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="authenticator" ref="defineModularRealmAuthenticator" />
        <property name="cacheManager" ref="ehCacheManager"/>
        <property name="realms">
            <list>
                <ref bean="assessorRealm" />
                <ref bean="userRealm" />
            </list>
        </property>
 </bean>
 
<bean id="assessorRealm" class="com.zealfi.zxbFamilyInfo.mgmt.shiro.AssessorRealm"/>

<bean id="userRealm" class="com.zealfi.zxbFamilyInfo.mgmt.shiro.UserRealm">
        <property name="authorizationCacheName" value="kyloan-shiro"/>
        <property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean>

其中realms引用的userRealm和assessorRealm是验证用户是否已经登录的类的配置,指定哪个类是用来验证的(这个类实现了shiro提供的接口,验证逻辑需要我们自己来编码具体实现)。由于现在的系统有两类用户,在不同的表中,所以需要提供两个实现类。

2.shiro相关代码的关键处:
subject:主题,话题;学科,科目;
猜想:最初是一个servlet请求,参数经过shiro框架处理,被封装成了subject对象。
ThreadContext.bind(subject);

登录时:
DefaultUsernamePasswordToken token = new DefaultUsernamePasswordToken(assessor.getName(), assessor.getPwd(), “assessor”);//这是shiro的构造方法,assessor是实体类SysAssessor(登录用户)的注解。
subject.login(token);//此处肯定构建了一个SysAssessor对象,并绑定到subject对象。

访问具体接口时:
Assessor assessor = getAssessorInfo();//获取当前登录用户。
public Assessor getAssessorInfo( )
{
Subject subject = SecurityUtils.getSubject( );
return (Assessor) subject.getPrincipal( );
}

Java文件反编译后,方法名没有变化(没有编程注解的名称),所以注解应该是生成了一个对应的配置文件。
反编译并不能让我们看到被框架包装后的代码,因为反编译工具肯定会去掉框架的包装部分,还原出我们最容易阅读的代码。包装后的代码只在class文件中。

ehcache.xml代码片段:

<cache name="passwordRetryCache"
       maxEntriesLocalHeap="2000"
       eternal="false"
       timeToIdleSeconds="300"
       timeToLiveSeconds="0"
       overflowToDisk="true"
       statistics="true">
</cache>

<cache name="AssessorServiceGetSchoolNameBySchoolId"
       maxEntriesLocalHeap="2000"
       eternal="false"
       timeToIdleSeconds="300"
       timeToLiveSeconds="600"
       overflowToDisk="false"
       statistics="false">
</cache>

属性解释:
name : "缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)  
maxElementsInMemory  : 缓存最大个数。
eternal="false"   : 对象是否永久有效,一但设置了,timeout将不起作用。 (必须设置)
maxEntriesLocalHeap="1000"  : 堆内存中最大缓存对象数,0没有限制(必须设置)
maxEntriesLocalDisk= "1000"   : 硬盘最大缓存个数。 
overflowToDisk="false"   : 当缓存达到maxElementsInMemory值是,是否允许溢出到磁盘(必须设置)(内存不足时,是否启用磁盘缓存。)
diskSpoolBufferSizeMB  : 这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。 
diskPersistent="false"  : 磁盘缓存在JVM重新启动时是否保持(默认为false)
timeToIdleSeconds="0"  : 导致元素过期的访问间隔(秒为单位),即当缓存闲置n秒后销毁。 当eternal为false时,这个属性才有效,0表示可以永远空闲,默认为0
timeToLiveSeconds="600"   : 元素在缓存里存在的时间(秒为单位),即当缓存存活n秒后销毁. 0 表示永远存在不过期
memoryStoreEvictionPolicy="LFU" : 当达到maxElementsInMemory时,如何强制进行驱逐默认使用"最近使用(LRU)"策略,其它还有先入先出FIFO,最少使用LFU,较少使用LRU
diskExpiryThreadIntervalSeconds :磁盘失效线程运行时间间隔,默认是120秒。
clearOnFlush   : 内存数量最大时是否清除。

@Cacheable(value = “AssessorServiceGetSchoolNameBySchoolId”, key = “#schoolId”)//注解类所属包org.springframework.cache.annotation
public String getSchoolNameBySchoolId(Long schoolId) {
DicSchoolInfo school = schoolMapper.selectByPrimaryKey(schoolId);
if (school != null) {
return school.getName();
}
return “”;
}

shiro的缓存配置(如:passwordRetryCache)和spring其他的缓存配置(如:AssessorServiceGetSchoolNameBySchoolId)都在ehcache.xml中

spring-shiro.xml中引用ehcache.xml
<!-- 使用ehcache缓存 -->
<bean id="ehCacheManagerFactory"
      class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:settings/ehcache.xml"/>
</bean>

web-servlet.xml中引用ehcache.xml(ehcache.xml在setting文件夹中)
<!-- 子容器读取配置文件(无法与父容器共享) -->
<context:property-placeholder location="classpath:settings/*.properties" file-encoding="utf-8" ignore-resource-not-found="false" ignore-unresolvable="true"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值