Shiro整合EhCache缓存(九)

简介: Shiro整合EhCache缓存(九)

一. 为什么要使用缓存?


在上一章节的时候,每次我们刷新页面,或者每次进行权限验证时,都需要进行查询该用户的所有的权限数据, 花费了大量的时间,查询相同的数据。 所以,我们需要缓存。 如果我们想查询的数据,在缓存里面,就直接从缓存里面拿 ,如果缓存中不存在想查询的数据,那么才从数据库中查询。 注意,当授权信息发生改变时,需要清理缓存,不然会一直使用原先的旧权限数据。


关于数据库缓存, 可以使用 redis ,也可以使用 ehcache,现在主流使用 redis 非关系型数据库。


与shiro 整合,我们建议还是使用原先的 ehcache 缓存。


二. Shiro 整合 EhCache 缓存


二.一 pom.xml 中添加依赖


<!-- 添加缓存 -->
<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.10.4</version>
</dependency>


二.二 添加ehcache 配置文件 到根路径下


ehcache.xml


<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />
</ehcache>


二.三 在 applicationContext-shiro.xml 配置文件中配置缓存


二.三.一 配置缓存 EhCacheManager ,指定缓存文件


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


二.三.二 将 cacheManager 注入到 securityManager 里面


<!-- 配置securityManager, 将一些信息注入到里面 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  <!-- 注入自定义realm -->
  <property name="realm" ref="myRealm"></property>
  <!-- 注入缓存管理 -->
  <property name="cacheManager" ref="cacheManager"></property>
</bean>


只需要这简单的三步,就可以了。 MyRealm 代码不用任何改变。


二.四 测试 Ehcache 缓存


输入网址: http://localhost:8080/SSM_Shiro_Cache/User/toLogin


填写 admin ,密码 1234


20200514153350185.png


20200514153356162.png


注意,查看控制台,最主要的是控制台信息。


20200514153401806.png


发现,只打印了一条 获取权限 的输出语句, 不像以前那样,打印出5,六条数据。


多次刷新部门表,


2020051415341029.png


发现,仍然没有二次查询。


输入网址: http://localhost:8080/SSM_Shiro_Cache/Dept/add,http://localhost:8080/SSM_Shiro_Cache/Dept/delete 利用注解权限验证, 发现,仍然只打印一条,依旧是从缓存中取出来的数据。


20200514153419976.png


Shiro 整合EhCache 缓存成功。


然而,如何去清理缓存呢?


三. Shiro 清理缓存


三.一 AuthorizingRealm


MyRealm 继承了 AuthorizingRealm 抽象类, 该 类 继承了 CachingRealm 类,


20200514153429557.png


可以在 MyRealm 中定义一个方法, 去调用 子类中的清理缓存的方法,来达到 清理缓存的目的。


三.二 MyRealm 中定义一个清理缓存的方法


/**
 * 清除缓存
 */
public void clearCache() {
  System.out.println("清除缓存数据");
  Subject subject=SecurityUtils.getSubject();
  // 调用子类去清理缓存
  super.clearCache(subject.getPrincipals());
}


三.三 注入 MyRealm 对象, 调用clearCache 方法


由于 我们已经通过 Spring 来管理 MyRealm 对象了, 所以可以将 MyRealm 对象注入到我们创建的类里面。


当权限发生改变时,调用即可。


如,我们放置到 PrivilegeAction 中


@Autowired
private MyRealm myRealm;
@RequestMapping("/clearCache")
  @ResponseBody
  public Map<String,Object> clearCache(){
    Map<String,Object> map=new HashMap<String,Object>();
    myRealm.clearCache();
    map.put("response_status", true);
    return map;
  }


当我们 通过 /Privilege/clearCache 访问时,就可以清理缓存了。


三.四 验证清理缓存


当输入 admin 登录之后, 多次刷新 dept页面,仍然使用的是缓存。


这个时候,我们输入网址: http://localhost:8080/SSM_Shiro_Cache/Privilege/clearCache

来进行清理缓存


2020051415344694.png


20200514153440311.png


这个时候,我们再跳转到 主页, /Main/toMain


20200514153452681.png


会重新去获取一次缓存。


再次多次刷新 dept页面, 从缓存中取数据


2020051415345877.png


清理缓存,是成功的。


本章节代码链接为:


链接:https://pan.baidu.com/s/1-t84HDcV8cCf59hBtd2AjA 
提取码:dust


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
5月前
|
存储 缓存 监控
SpringBoot配置第三方专业缓存技术Ehcache
SpringBoot配置第三方专业缓存技术Ehcache
46 1
|
5月前
|
缓存 监控 负载均衡
Java一分钟之-Ehcache:分布式缓存系统
【6月更文挑战第17天】**Ehcache是Java的开源缓存库,支持本地和分布式缓存,提供负载均衡、数据复制和容错能力。常见问题包括网络分区导致的数据不一致、缓存雪崩和配置不当引起的性能瓶颈。解决策略涉及选择强一致性策略、设置合理缓存过期时间和监控调整配置。使用Ehcache需添加相关依赖,并配置分布式缓存,如示例所示,通过CacheManager创建和管理缓存。实践中,持续监控和优化配置至关重要。**
131 1
|
5月前
|
缓存 Java
修改缓存供应商--EhCache
修改缓存供应商--EhCache
|
缓存 NoSQL Java
分布式系列教程(01) -Ehcache缓存架构
分布式系列教程(01) -Ehcache缓存架构
267 0
|
6月前
|
缓存 NoSQL Apache
Shiro - 缓存管理与CacheManagerAware接口
Shiro - 缓存管理与CacheManagerAware接口
115 0
|
6月前
|
SQL 缓存 Java
Hibernate - 整合Ehcache二级缓存使用详解
Hibernate - 整合Ehcache二级缓存使用详解
70 0
|
存储 缓存 NoSQL
EhCache缓存
在查询数据的时候,数据大多来自数据库,通常会基于SQL语句的方式与数据库交互,数据库一般会基于本地磁盘IO的形式将数据读取到内存,返回给Java服务端,Java服务端再将数据响应给客户端,做数据展示。
152 0
|
缓存 NoSQL Java
SpringBoot-26-缓存Ehcache的使用
spring缓存(cache)是在Spring3.1开始引入的,但是其本身只提供了缓存接口,不提供具体缓存的实现,其实现需要第三方缓存实现(Generic、EhCache、Redis等)。EhCache、Redis比较常用,使用Redis的时候需要先安装Redis服务器。
99 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
8天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题