使用Shiro+Redis实现Session共享

1、POM依赖

<dependency>
    <groupId>org.crazycake</groupId>
    <artifactId>shiro-redis</artifactId>
    <version>3.2.3</version>
</dependency>

2、ShiroConfig
添加四个Bean

@Bean
public RedisManager redisManager() {
	// 它可对redis的ip、端口等进行配置
    RedisManager redisManager = new RedisManager();
    return redisManager;
}

@Bean
public SessionDAO sessionDAO() {
    RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
    redisSessionDAO.setRedisManager(redisManager());
    // session在redis中的保存时间,最好大于session会话超时时间
    redisSessionDAO.setExpire(100);
    return redisSessionDAO;
}

@Bean
public RedisCacheManager cacheManager() {
    RedisCacheManager redisCacheManager = new RedisCacheManager();
    redisCacheManager.setRedisManager(redisManager());
    //redis中针对不同用户缓存
    redisCacheManager.setPrincipalIdFieldName("id");
    //用户权限信息缓存时间
    redisCacheManager.setExpire(200);
    return redisCacheManager;
}

@Bean
public SessionManager sessionManager() {
    DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
    sessionManager.setSessionDAO(sessionDAO());
    sessionManager.setCacheManager(cacheManager());
    // 局会话超时时间(单位毫秒),默认30分钟
    sessionManager.setGlobalSessionTimeout(10000);
    // 取消登录成功后url 后面的 JSESSIONID
    sessionManager.setSessionIdUrlRewritingEnabled(false);
    return sessionManager;
}

3、修改SecurityManager

@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(userRealm());
    securityManager.setSessionManager(sessionManager());
    securityManager.setCacheManager(cacheManager());
    return securityManager;
}

 

注意:

如果启动报错,User类要实现Serializable接口

posted @ 2019-04-14 23:48  陈文超  阅读(673)  评论(0)    收藏  举报