springboot+shiro整合redis
ShiJh Lv3

将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,包括RealmCacheManagerSessionManager,其中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 keylong timeout 设置一个值的失效时间,使用getExpire可获取
    haskey Object key 查询是否存在值
    opsForValue().get() Object key 获取值
    opsForValue().set() Object keyObject value 设置值
    opsForXXX().XXX() 省略 Redis中包含多种数据结构,使用方法大致相同
  • StringRedisTemplate:Key-Value均为String类型

 评论