• 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

    有图片

    有图片

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

    有图片

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

    多次刷新部门表,

    有图片

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

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

    Shiro 整合EhCache 缓存成功。

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

    三. Shiro 清理缓存

    三.一 AuthorizingRealm

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


    可以在 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

    来进行清理缓存

    有图片

    有图片

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

    有图片

    会重新去获取一次缓存。

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

    有图片

    清理缓存,是成功的。

    本章节代码链接为:

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

    谢谢您的观看,我是两个蝴蝶飞, 如果喜欢,请关注我,再次感谢 !!!

  • 相关阅读:
    String常用方法
    测试
    mongo aggregate group, group使用
    jquery ajax封装添加默认错误提示
    js时间格式化
    本地项目导入远程git仓库
    java设计模式:适配器模式
    mysql if示例
    hibernate指定查询字段
    js window resize延时
  • 原文地址:https://www.cnblogs.com/yjltx/p/14343191.html
Copyright © 2020-2023  润新知