| <version>1.11</version> | <version>1.11</version> | ||||
| </dependency> | </dependency> | ||||
| <!-- shiro ehcache (shiro缓存)--> | |||||
| <dependency> | |||||
| <groupId>org.apache.shiro</groupId> | |||||
| <artifactId>shiro-ehcache</artifactId> | |||||
| <version>1.4.0</version> | |||||
| <exclusions> | |||||
| <exclusion> | |||||
| <artifactId>slf4j-api</artifactId> | |||||
| <groupId>org.slf4j</groupId> | |||||
| </exclusion> | |||||
| </exclusions> | |||||
| </dependency> | |||||
| <!-- 分页支持pageHelper --> | <!-- 分页支持pageHelper --> | ||||
| <dependency> | <dependency> |
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.context.annotation.DependsOn; | import org.springframework.context.annotation.DependsOn; | ||||
| import org.apache.shiro.cache.ehcache.EhCacheManager; | |||||
| import javax.servlet.Filter; | import javax.servlet.Filter; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| public SecurityManager securityManager() { | public SecurityManager securityManager() { | ||||
| DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); | DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); | ||||
| securityManager.setRealm(myShiroRealm()); | securityManager.setRealm(myShiroRealm()); | ||||
| //注入缓存管理器 | |||||
| securityManager.setCacheManager(ehCacheManager()); | |||||
| // 无状态subjectFactory设置 | // 无状态subjectFactory设置 | ||||
| DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); | DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); | ||||
| DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); | DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); | ||||
| return authorizationAttributeSourceAdvisor; | return authorizationAttributeSourceAdvisor; | ||||
| } | } | ||||
| /** | |||||
| * shiro缓存管理器; | |||||
| * 需要注入对应的其它的实体类中: | |||||
| * 1、安全管理器:securityManager | |||||
| * 可见securityManager是整个shiro的核心; | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| @Bean | |||||
| public EhCacheManager ehCacheManager() { | |||||
| EhCacheManager cacheManager = new EhCacheManager(); | |||||
| cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml"); | |||||
| return cacheManager; | |||||
| } | |||||
| } | } |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
| xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" | |||||
| updateCheck="false" monitoring="autodetect" | |||||
| dynamicConfig="true"> | |||||
| <diskStore path="java.io.tmpdir/ehcache"/> | |||||
| <defaultCache | |||||
| maxElementsInMemory="50000" | |||||
| eternal="false" | |||||
| timeToIdleSeconds="3600" | |||||
| timeToLiveSeconds="3600" | |||||
| overflowToDisk="true" | |||||
| diskPersistent="false" | |||||
| diskExpiryThreadIntervalSeconds="120" | |||||
| /> | |||||
| <cache name="authorizationCache" | |||||
| maxEntriesLocalHeap="2000" | |||||
| eternal="false" | |||||
| timeToIdleSeconds="3600" | |||||
| timeToLiveSeconds="3600" | |||||
| overflowToDisk="false" | |||||
| statistics="true"> | |||||
| </cache> | |||||
| <cache name="authenticationCache" | |||||
| maxEntriesLocalHeap="2000" | |||||
| eternal="false" | |||||
| timeToIdleSeconds="3600" | |||||
| timeToLiveSeconds="3600" | |||||
| overflowToDisk="false" | |||||
| statistics="true"> | |||||
| </cache> | |||||
| <cache name="org.apache.shiro.realm.text.PropertiesRealm-0-accounts" | |||||
| maxElementsInMemory="1000" | |||||
| eternal="true" | |||||
| overflowToDisk="true"/> | |||||
| </ehcache> | |||||
| <!-- | |||||
| maxElementsInMemory="10000" //Cache中最多允许保存的数据对象的数量 | |||||
| external="false" //缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期 | |||||
| timeToLiveSeconds="3600" //缓存的存活时间,从开始创建的时间算起 | |||||
| timeToIdleSeconds="3600" //多长时间不访问该缓存,那么ehcache 就会清除该缓存 | |||||
| 这两个参数很容易误解,看文档根本没用,我仔细分析了ehcache的代码。结论如下: | |||||
| 1、timeToLiveSeconds的定义是:以创建时间为基准开始计算的超时时长; | |||||
| 2、timeToIdleSeconds的定义是:在创建时间和最近访问时间中取出离现在最近的时间作为基准计算的超时时长; | |||||
| 3、如果仅设置了timeToLiveSeconds,则该对象的超时时间=创建时间+timeToLiveSeconds,假设为A; | |||||
| 4、如果没设置timeToLiveSeconds,则该对象的超时时间=min(创建时间,最近访问时间)+timeToIdleSeconds,假设为B; | |||||
| 5、如果两者都设置了,则取出A、B最少的值,即min(A,B),表示只要有一个超时成立即算超时。 | |||||
| overflowToDisk="true" //内存不足时,是否启用磁盘缓存 | |||||
| diskSpoolBufferSizeMB //设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区 | |||||
| maxElementsOnDisk //硬盘最大缓存个数 | |||||
| diskPersistent //是否缓存虚拟机重启期数据The default value is false | |||||
| diskExpiryThreadIntervalSeconds //磁盘失效线程运行时间间隔,默认是120秒。 | |||||
| memoryStoreEvictionPolicy="LRU" //当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。 | |||||
| clearOnFlush //内存数量最大时是否清除 | |||||
| maxEntriesLocalHeap="0" | |||||
| maxEntriesLocalDisk="1000" | |||||
| --> |