1.6 Shiro之缓存管理

1.为什么要使用缓存

在没有使用缓存的情况下,我们每次发送请求都会调用一次doGetAuthorizationInfo方法来进行用户的授权操作,但是我们知道,一个用户具有的权限一般不会频繁的修改,也就是每次授权的内容都是一样的,所以我们希望在用户登录成功的第一次授权成功后将用户的权限保存在缓存中,下一次请求授权的话就直接从缓存中获取,这样效率会高一点。

2.使用Ehcache来实现缓存

2.1 引入依赖

    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache-core</artifactId>
      <version>2.5.3</version>
    </dependency>

2.2 添加ehcache的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!--diskStore:缓存数据持久化的目录 地址 -->
<diskStore path="C:\tools\ehcache" />
<!--
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
maxElementsInMemory:缓存中允许创建的最大对象数
overflowToDisk:内存不足时,是否启用磁盘缓存。
timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前, 两次访问时间的最大时
间间隔值,这只能在元素不是永久驻留时有效,如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,这只能
在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
diskPersistent:设定在虚拟机重启时是否进行磁盘存储,默认为false
diskExpiryThreadIntervalSeconds: 属性可以设置该线程执行的间隔时间(默认是120秒,不能太
小
1 FIFO,先进先出
2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元
素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
-->
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>在Shiro配置文件中添加缓存信息
</ehcache>

2.3 在Shiro配置文件中添加缓存信息

    <!--配置缓存管理器-->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <!--关联配置文件-->
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
    </bean>

    <!--配置SecurityManager-->
    <bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" id="securityManager">
        <!--关联自定义Realm-->
        <property name="realm" ref="myRealm"/>
        <property name="cacheManager" ref="cacheManager"/>
    </bean>

完整配置代码

<?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:context="http://www.springframework.org/schema/context"
       xmlns:conntext="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


    <!--定义凭证匹配器-->
    <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher" id="credentialsMatcher">
        <!--配置加密算法-->
        <property name="hashAlgorithmName" value="md5"/>
        <!--配置迭代的次数-->
        <property name="hashIterations" value="1024"/>
    </bean>

    <!--配置自定义的Realm-->
    <bean class="com.biao.realm.MyRealm" id="myRealm">
        <!--配置Realm对应的凭证匹配器-->
        <property name="credentialsMatcher" ref="credentialsMatcher"/>
    </bean>

    <!--配置缓存管理器-->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <!--关联配置文件-->
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
    </bean>

    <!--配置SecurityManager-->
    <bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" id="securityManager">
        <!--关联自定义Realm-->
        <property name="realm" ref="myRealm"/>
        <property name="cacheManager" ref="cacheManager"/>
    </bean>

    <!--注册一个ShiroFilterFactoryBean对象,注意id必须和web.xml文件中注册的targetBeanName要一致-->
    <bean class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" id="shiro">
        <!--注册一个SecurityManager对象-->
        <property name="securityManager" ref="securityManager"/>
        <!--注册登录地址-->
        <property name="loginUrl" value="/login.do"/>
        <!--登录成功的跳转地址-->
        <property name="successUrl" value="/success.jsp"/>
        <!--设置过滤器链-->
        <property name="filterChainDefinitions">
            <value>
                /login.do=authc
                /login.jsp=anon
                /**=authc
            </value>
        </property>
    </bean>




</beans>
上一篇:MySQL 误删数据、误更新数据(update,delete忘加where条件)


下一篇:C#中的?和??,null和Nullable