zoukankan      html  css  js  c++  java
  • 对shiro缓存的理解

    一:缓存的流程

    1:缓存的作用:用于缓存认证信息和授权信息,不用每次都去数据库里查询数据,而是从缓存中获取。

    2:shiro的本质工作是认证和授权,缓存的工作shiro没有做,而是预留了接口cache,cache中有对要缓存数据的操作方法,让开发者去做不同的实现。

    3:我们可以对cache接口进行redis,memcache或者ehcache的实现。

    4:CacheManager接口也是shiro预留的接口,供开发者去做不同实现,在CacheManager的实现类中返回上步中对cache的实现。

    5:可以给shiro的SecurityManager设置CacheManager,也可以给Realm设置CacheManager,最终都是给Realm设置CacheManager。因为最终是Realm在使用缓存,用来缓存认证信息和授权信息。

    6:缓存流程为:shiro通过CacheManager的实现类获取到Cache的实现类对象,然后调用Cache中的相应的方法对要缓存的数据进行操作。

    可以参考这篇文章对以上介绍有帮助:https://blog.csdn.net/amoscxy/article/details/82785235

    二:缓存的数据

    shiro默认开始授权缓存,而关闭认证缓存。

    下面分别介绍缓存两种信息的意义:

    (一)缓存授权信息

    1:当第一次访问授权时,会调用自定义Realm的获取授权数据的方法,从数据库中查询授权数据,并将其以登录者的Principal为键,存储在缓存中。以后的每次访问授权,就直接从缓存中获取,而不再从数据库中获取。

    2:清空缓存的时机:

    (1)当退出登录时,会调用清空缓存的方法,将以当前登陆者的Principal为键的缓存中的授权数据清空掉。

    (2)如果修改了用户的权限,而用户不退出系统,修改的权限不会生效,此时需要手动调用realm的clearCache方法清除缓存,待下次访问授权数据时,重新从数据库中获取,并存储在缓存中。

    (3)用户未退出登录的情况下,关闭浏览器,也清空缓存????(用户未退出登录,关闭浏览器,如果没有RememberMe的话,下次再访问系统,会有一个全新的session接待它,重新开始认证、授权,并将授权信息缓存起来,那么上次没有清空的缓存,什么时候自动失效呢?好像没有设置缓存失效的时间?)

    (4)Session到期了,也清空缓存???

    (二)缓存认证信息

    1:在调用subject.login()方法时,判断是否打开了认证缓存,如果打开了认证缓存,则从缓存中获取认证信息,如果获取不到,则从realm中获取认证信息,并将其放入缓存中。缓存认证信息有什么用?不是就认证一次吗?有人说:这是给当前线程未处理完的业务做得缓存,后续业务会用到啊,但是是哪些后续业务呢?

    2:清空认证信息缓存的时机

    (1)当退出登录时,会调用清空认证信息缓存的方法。

    疑问:

    分布式的情况下,共用一个redis缓存,如果一个实例改变了权限,其他实例怎么知道?共用redis的情况下,是不是不用通知其他实例了?

  • 相关阅读:
    常见设计模式,总结的不错(转)
    mysql查询当前时间,一天内,一周,一个月内的sql语句
    PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第一组(转)
    金融IC卡 ARQC和ARPC计算方法和实例(转)
    如何解决结果由block返回情况下的同步问题(转)
    linux进程编程:子进程创建及执行函数简介
    exec函数族实例解析
    C语言中system()函数的用法总结(转)
    关于JSPatch热修复
    做个这样的APP要多久?[转]
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302476.html
Copyright © 2011-2022 走看看