springboot+shiro整合redis
将shiro的缓存交给redis管理,可以提高访问性能
Shiro快速整合Redis
○安装Redis
菜鸟教程-安装Redis(下载Github上的MSI安装包更加方便。)
CMD命令 | 功能 |
---|---|
redis-server | 启动redis服务 |
redis-cli | 打开redis客户端 |
get、set | 简单存取Key-Value |
部署在远程服务器的Redis,需要打开服务器
:6379
端口的防火墙,并配置redis.conf
-protectmode no
○Maven依赖
Springboot-Redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Shiro-Redis
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis-spring-boot-starter</artifactId>
<version>${shiro-redis.version}</version>
</dependency>
○配置ShiroConfig
使用shiro-redis-spring-boot-starter
将会自动配置Shiro的SessionSecurityManager
,包括Realm
、CacheManager
和SessionManager
,其中Realm为IOC容器中所有Realm的子类,而另外两个则是继承了父类并使用Redis作为缓存的类。
由于通常情况下,我们需要配置Filter和filterMap等属性,所以只需要新配置ShiroFilterFactoryBean
即可,通过参数注入框架为我们默认配置的对象并稍微修改即可正常使用。
@Bean("shiroFilterFactoryBean")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(SessionsSecurityManager securityManager,
Map<String, Filter> filterMap,
SelectiveRealmAuthenticator authenticator) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//注入的manager已经配置好了Realm,如果没有重写authenticator则不需要进行修改
authenticator.setRealms(securityManager.getRealms());
securityManager.setAuthenticator(authenticator);
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
shiroFilterFactoryBean.setFilters(filterMap);
//spring自动注入的filterMap的key默认为class的simpleName
shiroFilterFactoryBean.setFilterChainDefinitionMap(
Cl.map().add("/**","anon")
.add("/user/info", OAuth2Filter.class.getSimpleName())
.castBuild()
);
shiroFilterFactoryBean.setGlobalFilters(
Cl.list(CNInvalidRequestFilter.class.getSimpleName())
);
return shiroFilterFactoryBean;
}
⚠️使用Redis存取的Object必须要实现
Serializable
接口
○RedisTemplate
spring为我们提供了一下两种对象,可直接注入使用:
-
RedisTemplate<Object,Object>
:Key-Value均为Object
类型常用方法 参数类型 作用 delete Object... key
删除一个或多个值 expire Object key
,long timeout
设置一个值的失效时间,使用getExpire可获取 haskey Object key
查询是否存在值 opsForValue().get() Object key
获取值 opsForValue().set() Object key
,Object value
设置值 opsForXXX().XXX() 省略 Redis中包含多种数据结构,使用方法大致相同 -
StringRedisTemplate
:Key-Value均为String
类型
评论