zoukankan      html  css  js  c++  java
  • shiro缓存

        shiro的可以权限控制内容包括:URL地址、Web页面的元素、以及方法,即shiro对用户权限的控制是细粒度的。从用户的一次访问来说,他可能需要最多经过三种、多次的验证。这里的多次怎么说呢?如果说Web页面的有10个元素加了Shiro标签,则一个页面的加载就需要10次验证。一句话:Shiro验证用户权限的频率很高,即访问数据库取得用户权限信息的频率很高。同时,用户的权限信息,是基本稳定的。很明显,这样的情景需要——缓存。

    shiro对缓存的支持

        shiro并没有实现缓存的功能,shiro的缓存支持只是一个抽象的API。这个抽象是基于从多缓存机制的产品之上的。换句话说,shiro可以“坐拥三千妃子”啊。下面是《Apache Shiro 1.2.x 用户指南》 中文翻译中的内容:
        Shiro 有三个重要的缓存接口:

    • CacheManager - 负责所有缓存的主要管理组件,它返回 Cache 实例。
    • Cache - 维护key/value 对。
    • CacheManagerAware - 通过想要接收和使用 CacheManager 实例的组件来实现。

        CacheManager 返回Cache 实例,各种不同的Shiro 组件使用这些Cache 实例来缓存必要的数据。任何实现了 CacheManagerAware 的 Shiro 组件将会自动地接收一个配置好的 CacheManager,该 CacheManager 能够用来获取 Cache 实例。

    缓存的配置(spring mvc)

        shiro的缓存配置非常简单,如下:

    • 在application-shiro.xml(shiro的配置文件):      
    <!-- shiro的缓存管理器,然后需要将缓存管理器注入   
              到安全管理其中  -->  
    <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
            <!--classpath是缓存属性的配置文件  -->  
            <property name="cacheManagerConfigFile" value="classpath:config/ehcache-shiro.xml" />  
    </bean>
    <!-- shiro管理中心类  start-->   
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
         <property name="realm" ref="shiroRealm"></property>   
         <property name="subjectFactory" ref="casSubjectFactory"></property>  
              <!--注入缓存管理器  -->  
         <property name="cacheManager" ref="shiroEhcacheManager"></property>  
    </bean>
    • 缓存属性配置文件:
    <ehcache updateCheck="false" name="shiroCache">  
        <defaultCache  
                  <!--最大缓存数量  -->  
                maxElementsInMemory="10000"  
                eternal="false"  
                timeToIdleSeconds="120"  
                timeToLiveSeconds="120"  
                overflowToDisk="false"  
                diskPersistent="false"  
                diskExpiryThreadIntervalSeconds="120"  
                />  
    </ehcache>

    shiro使用缓存遇到的问题

          shiro使用缓存极大的提高了程序的反应速度,但是对于新手来说,很容易碰到两个问题。
          第一个:
                现象:退出登录后,再次访问程序无需重新登录。
                原因:退出登录时,没有清理缓存。
          第二个:
                现象:改变用户权限时,不能及时反映出来,需要重新登陆才可以。
                原因:改变用户权限是,缓存中的数据还是原来的权限信息。
          对于第一个问题:上网查的一些资料,大部分建议改造一下realm的自定义实现,重写一下退出的缓存处理方法。对于新手来说,这可能不太好理解。那么这里推荐一种简单的方式:过滤退出地址,交给shiro的logout过滤器处理。logout会调用subject.logout()方法,清理掉shiro的缓存。只要简单的在过滤器链中加入对退出地址的过滤就好了,配置如下:

    <!-- 过滤器链,请求url对应的过滤器 -->  
         <property name="filterChainDefinitions">  
               <value>  
                     /message.jsp=anon  
                                        <!-- 退出地址,交给logout过滤器处理 -->  
                     /logout=logout  
                     /shiro-cas=casFilter         
                     /** =user  
               </value>  
         </property>

          对于第二个问题,也就说如何解决缓存同步。目前我自己还没有好的解决方案,有知道的麻烦,教教我。这里,我只能是粗暴的选择,不使用缓存。网上有解决方案,我还需要研究研究。

    集群缓存

        这次的项目,实际上我需要用到的是集群缓存。所以对于上面的第二个问题,还没有去深入。但是,集群缓存这块也还没有弄懂。所以,下篇再介绍了。

  • 相关阅读:
    [LeetCode]603. 连续空余座位(Mysql、自连接)
    [LeetCode]671. 二叉树中第二小的节点(递归)
    [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)
    [LeetCode]26. 删除排序数组中的重复项(数组,双指针)
    C# 把引用的dll嵌入到exe文件中
    iptables规则表
    [转载]EF Code First 学习笔记:约定配置
    使用itunes同步ios时丢失照片恢复
    USB硬件远程共享解决iphone已停用
    C# 非独占延时函数 非Sleep
  • 原文地址:https://www.cnblogs.com/007sx/p/5816899.html
Copyright © 2011-2022 走看看