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类型
评论