shiro 集成 ehcache

1.shiro做权限以后,每次点击页面授权方法每次都会请求数据库,造成重复请求,所以集成ehcache做缓存管理。之前用shiro-ehcache做,一直报错没解决,于是放弃这种方法, 改用一般jar包。

jar :

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.6.11</version>
</dependency>

2.新建ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <!--  <diskStore path="C:/ehcache"/> -->
    <!-- user.home:用户的家目录。
   user.dir:用户的当前工作目录。
   java.io.tmpdir:Java临时目录。 -->
    <diskStore path="java.io.tmpdir"/>

    <!-- 默认缓存配置. -->
    <!-- <defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"
        overflowToDisk="true" maxEntriesLocalDisk="100000"/> -->
    <defaultCache
            maxElementsInMemory="10000"
            maxElementsOnDisk="0"
            eternal="true"
            overflowToDisk="true"
            diskPersistent="false"
            timeToIdleSeconds="0"
            timeToLiveSeconds="0"
            diskSpoolBufferSizeMB="50"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LFU"
    />

    <cache name="cache name*"
           maxElementsInMemory="10000"
           eternal="false"
           timeToIdleSeconds="120"
           timeToLiveSeconds="120"
           maxElementsOnDisk="10000000"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>

    <!--默认缓存配置,以下属性是必须的:
            name :cache的标识符,在一个CacheManager中必须唯一。
            maxElementsInMemory : 在内存中缓存的element的最大数目。
            maxElementsOnDisk : 在磁盘上缓存的element的最大数目。
            eternal : 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略。
            overflowToDisk : 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上。
            以下属性是可选的:
            timeToIdleSeconds : 缓存element在过期前的空闲时间。
            timeToLiveSeconds : 缓存element的有效生命期。
            diskPersistent : 在VM重启的时候是否持久化磁盘缓存,默认是false。
            diskExpiryThreadIntervalSeconds : 磁盘缓存的清理线程运行间隔,默认是120秒.
            memoryStoreEvictionPolicy : 当内存缓存达到最大,有新的element加入的时候,
            移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO
            缓存子元素:
            cacheEventListenerFactory:注册相应的的缓存监听类,用于处理缓存事件,如put,remove,update,和expire
            bootstrapCacheLoaderFactory:指定相应的BootstrapCacheLoader,用于在初始化缓存,以及自动设置。
    -->

    <!--
        LRU:LRU是Least Recently Used 的缩写 LRU缓存把最近最少使用的数据移除,让给最新读取的数据。而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance(性能)
        LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!
        FIFO(First In First Out ,先进先出)
      算法是根据先进先出原理来淘汰数据的,实现上是最简单的一种,具体算法如下:
      1. 新访问的数据插入FIFO队列尾部,数据在FIFO队列中顺序移动;
      2. 淘汰FIFO队列头部的数据;
     -->
</ehcache>

3.新建applicationContext-cache.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/cache
      http://www.springframework.org/schema/cache/spring-cache.xsd ">

    <!-- 缓存配置  -->
    <bean id="ehCacheManager"
          class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml" />
    </bean>

    <!-- shiro封装cacheManager -->
    <bean id="shiroCacheManager"
          class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManager" ref="ehCacheManager" />
    </bean>

    <!-- spring 封装ehcache缓存管理器  -->
    <bean id="springCacheManager"
          class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehCacheManager" />
    </bean>

    <!-- 激活spring 缓存注解 -->
    <cache:annotation-driven cache-manager="springCacheManager"/>

</beans>

4.beans-leaf-shiro.xml 中引入 cacheManager

<!-- 配置shiro安全管理器 -->
 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
     <property name="realms" ref="customRealm"/>
     <!-- 配置记住我 -->
     <property name="rememberMeManager" ref="rememberMe"/>
     <!--shiro的执行流程:应用程序代码-SecurityManager-Realm(查询授权和认证数据),所以将EhCache加在Realm之前最合适-->
     <property name="cacheManager" ref="shiroCacheManager" />

 </bean>

第二种方式,springboot 方式

<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>

2.ShiroConfig 中

/**
 *<ehcacheManager>
 *@param
 *
 *@return
 *@Author WANG.SONG.
 */
@Bean
public EhCacheManager ehCacheManager(){
    EhCacheManager ehCacheManager=new EhCacheManager();
    return ehCacheManager;
}

3. securityManager中加入ehCacheManager

/**
 * 注入 securityManager
 */
@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    // 设置realm.
    securityManager.setRealm(customRealm());
    // 设置sessionManager
    securityManager.setSessionManager(sessionManager());
    //ehCache
    securityManager.setCacheManager(ehCacheManager());
    return securityManager;
}

猜你喜欢

转载自blog.csdn.net/ws346348183/article/details/85240541