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>
对于第二个问题,也就说如何解决缓存同步。目前我自己还没有好的解决方案,有知道的麻烦,教教我。这里,我只能是粗暴的选择,不使用缓存。网上有解决方案,我还需要研究研究。
集群缓存
这次的项目,实际上我需要用到的是集群缓存。所以对于上面的第二个问题,还没有去深入。但是,集群缓存这块也还没有弄懂。所以,下篇再介绍了。
shiro缓存的更多相关文章
- shiro缓存管理
一. 概述 Shiro作为一个开源的权限框架,其组件化的设计思想使得开发者可以根据具体业务场景灵活地实现权限管理方案,权限粒度的控制非常方便.首先,我们来看看Shiro框架的架构图:从上图我们可以很清 ...
- 使用shiro缓存用户身份信息的时候报:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource
最近在使用shiro缓存用户的身份信息的时候,报了simpleByteSource不能序列化,跟进源码一看,原来这个类没有实现序列化的接口,但是我在缓存身份信息的实现又要用到这个类,解决方法:重写一个 ...
- Shrio00 Shiro角色授权、Shiro权限授权、开启Shiro缓存
1 需求01 用户进行过认证登录后,某些接口是有权限限制的:如何实现只有相应权限的用户才可以调用相应接口 2 修改shiro配置类 ShiroConfiguration package cn.xia ...
- SpringBoot中Shiro缓存使用Redis、Ehcache
在SpringBoot中Shiro缓存使用Redis.Ehcache实现的两种方式实例 SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这sh ...
- Shiro 缓存失效以后的一个问题
shiro 1.2.2和1.2.3 为shiro设置了缓存,但是当服务器运行几个小时后,页面判断 <shiro:hasPermission name="admin"> ...
- Shiro缓存(十三)
使用缓存,可以解决每次访问请求都查数据库的问题.第一次授权后存入缓存. 缓存流程 shiro中提供了对认证信息和授权信息的缓存.shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启 ...
- shiro缓存机制
Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现.对于Cache的一些概念可以参考我的<Spr ...
- Shiro缓存使用Redis、Ehcache、自带的MpCache实现的三种方式实例
第一种:使用Redis做缓存,将数据存储到redis数据库中 第一步:在项目里面引入redis,配置文件如下: 配置文件:spring_shiro_redis.xml <?xml version ...
- shiro缓存配置
realm的缓存 方法一: 在securityManager配置中添加cacheManager配置项,会注入到realm中. 方法二:在realm中配置. realm本身实现了CacheManager ...
随机推荐
- Solr4:查询参数fq的用法(对结果进行过滤;两组关键词组合查询)
Solr查询参数文档可以参考: http://wiki.apache.org/solr/CommonQueryParameters#head-6522ef80f22d0e50d2f12ec487758 ...
- 给openvpn客户分配固定ip地址
虽然openvpn提供dhcp服务,但是dhcp是有租约的,到期后会重新分配ip,造成连接中断的问题,所以最好还是给客户端固定一个ip. 思路:开启客户端配置目录,然后为每一个客户建一个配置文件,里面 ...
- linux下使用find命令根据系统时间查找文件用法
这篇文章主要为大家介绍了find 命令有几个用于根据您系统的时间戳搜索文件的选项. 这些时间戳包括 mtime 文件内容上次修改时间 atime 文件被读取或访问的时间ctime 文件状态变化时间 m ...
- [gj]HK一行所见闻
香港一行 20多年来,未未去过HK,前段时间由于工作关系去了趟HK.感触良多. 一清早,福田过关,做火车,做地铁,一通到了目的地. 总结对那边的印象: 1,所有人都是粤语,包括工作交流.而且他们不怎么 ...
- 苹果开发小记(一):NSString 的比较用法
转自:http://blog.sina.com.cn/s/blog_897dd7be0100teh6.html 做了几个月的苹果,很多的思想方法都可以遵循一定规律来做的.NSString 比较字符串, ...
- C++ 顺序容器原理
容器分为顺序容器与关联容器,顺序容器也称为序列式容器.序列式容器按元素插入的顺序存储元素,这些元素可以进行排序,但未必是有序的.C++本身内置了一个序列式容器array(数组),STL另外提供了vec ...
- cocos2d-x分别在Visual Studio和eclipse中设置启用Box2D
cocos2d-x内嵌有chipmunk和Box2D两个物理库,默认启用的是chipmunk.如果想使用Box2D,可做如下设置.PS:本人所用的版本是cocos2d-x-2.2.5. 一.在Visu ...
- mongodump 失败且导致mongo服务挂掉【本质原因,wt文件损坏】
====================================================== 标题遇到的问题是我要解决的问题的中间环节. 原本问题是:需要在之前standlone的Mo ...
- mysql utf8mb4 所引起的问题
有一个项目需要存储ios的表情(emoji表情)这种表情虽然是utf8编码,但是一个字符需要占用4个字节,而MySQL utf8编码只能存放3字节的字符.在MySQL 5.6中,可以设置编码为utf8 ...
- 基于jquery右侧悬浮加入购物车代码
分享一款基于jquery右侧悬浮加入购物车代码.这是一款基于jQuery实现的仿天猫右侧悬浮加入购物车菜单代码. 在线预览 源码下载 实现的代码: <!--左侧产品parabola.js控制 ...