Spring Boot集成shiro之使用redis缓存demo

1.背景

上次发了这篇文章《Spring Boot集成Shiro快速入门Demo》后,有网友“just.blue”后台反馈集成redis有点问题,今天特地把集成过程发出来

2.为什么要使用cache

用来减轻数据库的访问压力,从而提升查询效率。

3.Shiro使用Redis做缓存

redis环境准备

参照代码工程li面redis模块里面docker,按照要求启动即可

引入pom,xml

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

redis配置

spring:redis:database: 0port: 6379host: 127.0.0.1password: 123456timeout=3000:jedis:pool:max-active: 8max-idle: 8max-wait: -1min-idle: 0

cache接口实现

创建RedisCacheManager实现CacheManager接口

package com.et.shiro.cache;import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.apache.shiro.cache.CacheManager;public class RedisCacheManager implements CacheManager {@Overridepublic <K, V> Cache<K, V> getCache(String cacheKey) throws CacheException {return new RedisCache<>(cacheKey);}
}

创建RedisCache实现Cache接口

package com.et.shiro.cache;import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.util.Collection;
import java.util.Set;public class RedisCache<K, V> implements Cache<K, V> {private String cacheName;public RedisCache() {}public RedisCache(String cacheName) {this.cacheName = cacheName;}private RedisTemplate getRedisTemplate() {RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate");redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());return redisTemplate;}@Overridepublic V get(K k) throws CacheException {return (V) getRedisTemplate().opsForHash().get(this.cacheName,k.toString());}@Overridepublic V put(K k, V v) throws CacheException {getRedisTemplate().opsForHash().put(this.cacheName,k.toString(), v);return null;}@Overridepublic V remove(K k) throws CacheException {return (V) getRedisTemplate().opsForHash().delete(this.cacheName,k.toString());}@Overridepublic void clear() throws CacheException {getRedisTemplate().opsForHash().delete(this.cacheName);}@Overridepublic int size() {return getRedisTemplate().opsForHash().size(this.cacheName).intValue();}@Overridepublic Set<K> keys() {return getRedisTemplate().opsForHash().keys(this.cacheName);}@Overridepublic Collection<V> values() {return getRedisTemplate().opsForHash().values(this.cacheName);}
}

获取bean工具类

package com.et.shiro.cache;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class ApplicationContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public static <T> T getBean(String beanName) {return (T)applicationContext.getBean(beanName);}public static <T> T getBean(Class<T> className) {return applicationContext.getBean(className);}
}

由于自定义realm中认证所需要的盐值内部并没有实现序列化接口,所以我们需要自己定一个MyByteSource继承SimpleByteSource并实现Serializable接口

package com.et.shiro.config;import org.apache.shiro.util.SimpleByteSource;import java.io.Serializable;public class MyByteSource extends SimpleByteSource implements Serializable {public MyByteSource(String string) {super(string);}
}

在自定义的Realm中需要在认证的方法中,改写salt的处理。

@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)throws AuthenticationException {System.out.println("MyShiroRealm.doGetAuthenticationInfo()");String username = (String)token.getPrincipal();System.out.println(token.getCredentials());//query user by username//in here ,you can cache some data for efficientUserInfo userInfo = userInfoService.findByUsername(username);System.out.println("----->>userInfo="+userInfo);if(userInfo == null){return null;}SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(userInfo, //usernameuserInfo.getPassword(), //passwordnew MyByteSource(userInfo.getCredentialsSalt()),//ByteSource.Util.bytes(userInfo.getCredentialsSalt()),//salt=username+saltgetName()  //realm name);return authenticationInfo;
}

注意实体类(角色类,用户类,权限类)要记得实现Serializable接口 最后在Shiro配置类中开启缓存,使用我们自己定义的RedisManager

@Bean
public MyShiroRealm myShiroRealm(){MyShiroRealm myShiroRealm = new MyShiroRealm();myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());// 设置解密规则// 开启全局缓存myShiroRealm.setCachingEnabled(true);// 开启认证缓存myShiroRealm.setAuthenticationCachingEnabled(true);// 设置认证缓存管理的名字myShiroRealm.setAuthenticationCacheName("authenticationCache");// 开启授权缓存管理myShiroRealm.setAuthorizationCachingEnabled(true);// 设置授权缓存管理的名字myShiroRealm.setAuthorizationCacheName("authorizationCache");// 开启Redis缓存myShiroRealm.setCacheManager(new RedisCacheManager());return myShiroRealm;
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.

4.测试

启动项目,访问http://127.0.0.1:8088/userInfo/userAdd,会跳转到登录页,输入admin 123456,查看redis是否缓存了

538

登录用户,第一次会从数据库中查询,并通过RedisTemplate的put方法将用户信息装入缓存,下次再刷新首页就会从redis中查询权限,授权等信息。退出时会调用RedisTemplate中的remove方法清除向对应的用户缓存。

5.引用

  • Spring Boot集成shiro之使用redis缓存demo | Harries Blog™
  • https://www.cnblogs.com/dataoblogs/p/14121884.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【R语言】获取任意颜色的HTML 颜色代码、十六进制颜色代码、 RGB代码

网站来源&#xff1a; https://htmlcolorcodes.com/ 界面如下所示&#xff1a; 通过鼠标任意选择不同的颜色&#xff0c;就能获取该色的十六进制代码、RGB代码等。 除此之外&#xff0c;还提供了一些常用颜色的便捷选项,如下&#xff1a; 任意选择一种颜色&#xff0c;即可出…

会声会影2024旗舰版神器,让你的视频秒变大片,小白也能轻松上手

在数字时代&#xff0c;视频已经成为了人们表达自我、记录生活的重要方式。无论是旅行中的美景&#xff0c;还是生活中的点滴瞬间&#xff0c;我们都渴望能够用镜头捕捉下来&#xff0c;并通过精心剪辑&#xff0c;将这些美好的画面永远珍藏。然而&#xff0c;对于大多数人来说…

【spring boot+Lazy ORM+mysql】开发一个数据库管理系统实现对应数据库数据查看和修改

【spring bootLazy ORMmysql】开发一个数据库管理系统实现对应数据库数据查看和修改 演示项目地址&#xff1a;http://124.222.48.62:30193/wu-smart-acw-ui/index.html#/login &#xff08;admin/admin&#xff09; 功能 用户登录注册新增、编辑数实例新增、编辑数据库信息…

[论文笔记]SELF-INSTRUCT

引言 今天带来论文SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions的笔记。 大型指令微调的语言模型(被微调以响应指令)展示了在新任务上零样本泛化的显著能力。然而&#xff0c;它们严重依赖于人工编写的指令数据&#xff0c;这种数据在数量、多…

element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入

解决方案&#xff1a; 我是form表单嵌套表格&#xff0c;里面的el-input输入框&#xff0c;输入第一个值的时候会突然失去焦点&#xff0c;需要再次点击输入框才能正常输入&#xff0c;原因是table的key值&#xff0c;需要改成正常的index即可&#xff0c;如果你是循环的&…

服务器重装系统与磁盘操作

诱因&#xff1a;服务器原来装的EXSI&#xff0c;现在要重装一个ubuntu server&#xff0c;出现了下面一些问题&#xff0c;在此记录一下。 目录 1、过程中出现的问题&#xff08;2024.5.26&#xff09;1.1 问题1&#xff1a;如何磨掉原来的ESXI&#xff1f;1.2 问题2&#xf…

赶紧收藏!2024 年最常见 20道 Redis面试题(九)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Redis面试题&#xff08;八&#xff09;-CSDN博客 十七、如何使用Redis做异步队列&#xff1f; 使用 Redis 作为异步队列主要依赖于 Redis 的列表&#xff08;list&#xff09;数据结构&#xff0c;列表提供了…

webserver服务器从零搭建到上线(五)|noncopyable类和Logger类

文章目录 noncopyable类delete掉了拷贝构造和析构protected成员1. 允许派生2.防止直接实例化 主要使用场景 Logger类定义日志级别输出一个日志类实现对应的成员函数实现宏函数来调用日志类 知识拓展 noncopyable类 我们首先进入/muduo/net中查看TcpServer.h、EventLoop.h等等核…

可以免费测试的身份证实名认证接口-C#调用示例

在数字时代的浪潮中&#xff0c;每秒都在上演着信息的急速交互。但在这份高效背后&#xff0c;如何确保每一次交易、登录的安全与真实性&#xff0c;成为了困扰线上平台的一大难题。翔云身份证实名认证接口的出现&#xff0c;正是您稳固防线&#xff0c;提升用户体验的得力助手…

信号量和事件及队列补充

【一】信号量(了解&#xff09; 信号量Semahpore&#xff08;同线程一样&#xff09; 【1】引入 互斥锁 同时只允许一个线程更改数据&#xff0c;而Semaphore是同时允许一定数量的线程更改数据 【2】例子 比如厕所有3个坑&#xff0c;那最多只允许3个人上厕所&#xff0c;后…

死锁和递归锁

【一】死锁 【1】介绍 死锁是指两个或多个进程&#xff0c;在执行过程中&#xff0c;因争夺资源而造成了互相等待的现象 即两个或多个进程持有各自的锁并视图获取对方持有的锁&#xff0c;从而导致阻塞&#xff0c;不能继续执行&#xff0c;一直僵在这 这种情况下&#xff0…

LeetCode - 贪心算法 (Greedy Algorithm) 集合 [分配问题、区间问题]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…

Linux相关知识

一.Linux是什么? 1.Linux是一款开源免费的操作系统 目前市面上较知名的发行版有:Ubuntu,ReaHat,Centos,Debain… ​ 2.Linux的优势? ​ ①性能强劲,安全稳定 ​ ②可定制 ​ ③硬件配置要求低 ​ ④嵌入移动设备 二.Linux安装 三.文件和目录结构 /bin 常用命令 /sbin root…

奇门遁甲古籍《烟奇要览》

《烟奇要览》 全书共178页 时间有限&#xff0c;仅上传部分图片&#xff01;

YOLOv10介绍与推理--图片和视频演示(附源码)

导 读 本文主要对YOLOv10做简单介绍并给出推理图片和视频的步骤演示。 YOLOv10简介 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑…

人工智能超万卡集群的核心设计原则和架构

超万卡集群的核心设计原则和架构 超万卡集群建设方兴未艾,当前主要依托英伟达GPU及其设备。英伟达GPU在大模型训练中表现卓越,但国产AI芯片虽进步显著,性能与生态构建仍存差距。面对诸多挑战,构建技术领先、基于国产生态的超万卡集群,仍需不断突破与创新。 大模型升级至万…

Linux终端连接工具

终端连接工具有很多中&#xff0c;这里我只收集了一些常用的或免费的工具 我一般会配套使用&#xff1a; FinalShell -->命令行工具&#xff08;Mac和win&#xff09; WinSCP -->文件上传工具&#xff08;win&#xff09; filezilla -->文件上传工具&#xff08;Mac …

TensorBoard相关学习

TensorBoard是Google为TensorFlow框架开发的一个强大的可视化工具&#xff0c;它可以帮助用户更直观地理解、分析和调试机器学习模型的训练过程。通过TensorBoard&#xff0c;你可以可视化模型的结构、监控训练过程中的指标变化&#xff08;如损失函数、准确率&#xff09;、查…

金锋关晓柔短视频:成都鼎茂宏升文化传媒公司

金锋关晓柔短视频&#xff1a;情感与创意的交织 在短视频的浪潮中&#xff0c;无数创作者凭借独特的视角和创意脱颖而出。其中&#xff0c;金锋和关晓柔共同打造的短视频系列以其深厚的情感内涵和精湛的创意表达&#xff0c;成都鼎茂宏升文化传媒公司吸引了大量观众的关注&…

Unity Hub 添加模块报错 Validation Failed 的解决办法

提供两种方法&#xff0c;请自行选择其中一种。 在C:\Windows\System32\drivers\etc\hosts中添加下面的内容并保存后&#xff0c;完全关闭Unity Hub并重新打开&#xff0c;再次尝试下载刚刚失败的模块。 127.0.0.1 public-cdn.cloud.unity3d.com 127.0.0.1 public-cdn.cloud.…