SpringBoot+Shiro中使用Redis的两种缓存方案

it2024-10-15  36

SpringBoot+Shiro中使用Redis的两种缓存方案

Shiro中的缓存(Realm)

导入依赖

<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>2.4.2.1-RELEASE</version> <exclusions> <exclusion> <!--排除shiro-redis中的shiro-core依赖,防止依赖版本冲突--> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> </exclusion> </exclusions> </dependency>

配置信息

ShiroConfig配置类

@Configuration public class ShiroConfig { //将自己的验证方式加入容器 @Bean("authorizer") public CustomRealm myShiroRealm() { CustomRealm customRealm = new CustomRealm(); //设置shiro缓存为redis customRealm.setCacheManager(redisCacheManager()); //AuthenticationCachingEnabled默认为false,需要开启设置为true customRealm.setAuthenticationCachingEnabled(true); return customRealm; } @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition(){ DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); chainDefinition.addPathDefinition("/add","authc"); chainDefinition.addPathDefinition("/admin","authc"); chainDefinition.addPathDefinition("/getUser","authc"); return chainDefinition; } @Bean public RedisCacheManager redisCacheManager(){ RedisCacheManager redisCacheManager = new RedisCacheManager(); redisCacheManager.setRedisManager(redisManager()); return redisCacheManager; } @Bean public RedisManager redisManager(){ //RedisManager为Redis信息,默认host=localhost,port=6379 return new RedisManager(); } }

SpringBoot配置文件

spring: cache: type: redis

到此,Shiro+Redis缓存即可生效,无需再进行其他操作。

但此时Redis只会缓存Realm中身份、角色、权限信息,并不会缓存其他请求中的其他数据信息

Realm中的身份信息是通过Service来自于数据库,因此,我们可以从Service处进行缓存,并可以缓存其他请求的数据信息。

Spring中的缓存(Service)

导入依赖

<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.6.0</version> </dependency> <!--SpringBoot缓存启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--无需导入Shiro-Redis包-->

配置信息

CacheConfig

@Configuration @EnableCaching //开启缓存注解 public class CacheConfig { /** *修改缓存到redis过程中value的序列化方式,改为json *增加redis中数据的可读性。 */ @Bean public RedisCacheConfiguration cacheConfiguration(){ DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); registerDefaultConverters(conversionService); RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json())) .withConversionService(conversionService) .entryTtl(Duration.ZERO) .computePrefixWith(CacheKeyPrefix.simple()); return configuration; } }

RedisConfig

@Configuration public class RedisConfig { //修改缓存到redis中key的序列化方式,改为String @Bean public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){ RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(connectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; } }

ShiroConfig配置类

@Configuration public class ShiroConfig { //将自己的验证方式加入容器 @Bean("authorizer") public CustomRealm myShiroRealm() { CustomRealm customRealm = new CustomRealm(); return customRealm; } @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition(){ DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); chainDefinition.addPathDefinition("/add","authc"); chainDefinition.addPathDefinition("/admin","authc"); chainDefinition.addPathDefinition("/getUser","authc"); return chainDefinition; } //解决在shiro场景下使用Spring缓存不生效的问题 @Bean public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){ DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator(); /** * setUsePrefix(false)用于解决一个奇怪的bug。在引入spring aop的情况下。 * 在@Controller注解的类的方法中加入@RequiresRole等shiro注解,会导致该方法无法映射请求, * 导致返回404。 加入这项配置能解决这个bug */ defaultAdvisorAutoProxyCreator.setUsePrefix(true); //defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); return defaultAdvisorAutoProxyCreator; } }

SpringBoot配置文件

#spring.redis.database=0 #host默认为localhost #spring.redis.host=localhost #port默认为6379 #spring.redis.port=6379

Service类中执行缓存

@CacheConfig(cacheNames = "user") @Service public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService{ @Override @Cacheable(key = "#root.args[0]") public User getByIds(Integer id) { return baseMapper.selectById(id); } }

至此,在Spring中使用缓存即可生效,当登录或查询时,都会执行缓存操作并在下次执行相同操作时从Redis中获取数据。

最新回复(0)