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"/>