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处进行缓存,并可以缓存其他请求的数据信息。
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=6379Service类中执行缓存
@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中获取数据。