# 实现shiro redis session共享

## 简介
本篇文章将介绍如何在使用shiro的web应用中实现redis session共享,通过将shiro的session保存到redis中,实现多个服务器间session的共享。

## 流程步骤
下表展示了实现shiro redis session共享的具体流程:

| 步骤 | 描述 |
|------|------|
|1| 引入redis依赖|
|2| 配置redis的相关信息|
|3| 自定义RedisSessionDAO|
|4| 配置securityManager|

## 详细步骤

### 步骤1:引入redis依赖
首先在项目的pom.xml文件中引入redis相关依赖:

```xml

org.crazycake
shiro-redis
3.1.0

```

### 步骤2:配置redis的相关信息
在shiro.ini或者application.yml等配置文件中配置redis相关信息,示例:

```properties
shiro.cacheManager = org.crazycake.shiro.RedisCacheManager
redis.host = 127.0.0.1
redis.port = 6379
```

### 步骤3:自定义RedisSessionDAO
创建一个自定义的RedisSessionDAO类,用于将session存储到redis中:

```java
public class RedisSessionDAO extends AbstractSessionDAO {
public Serializable doCreate(Session session) {
// 将session存储到redis
Serializable sessionId = generateSessionId(session);
assignSessionId(session, sessionId);
// save to redis
}

public void doUpdate(Session session) {
// 更新redis中的session
}

public void doDelete(Session session) {
// 从redis中删除session
}

public Session doReadSession(Serializable sessionId) {
// 从redis中读取session
}
}
```

### 步骤4:配置securityManager
在shiro的配置中配置自定义的RedisSessionDAO:

```java
@Bean
public RedisManager redisManager() {
RedisManager redisManager = new RedisManager();
redisManager.setHost("127.0.0.1");
redisManager.setPort(6379);
return redisManager;
}

@Bean
public RedisSessionDAO redisSessionDAO() {
RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
redisSessionDAO.setRedisManager(redisManager());
return redisSessionDAO;
}

@Bean
public DefaultWebSessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionDAO(redisSessionDAO());
return sessionManager;
}

@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myRealm());
securityManager.setSessionManager(sessionManager());
return securityManager;
}
```

通过以上配置,就实现了shiro redis session共享的功能。小白开发者可以根据这篇文章的指导,按照步骤完成配置,实现session的共享功能。如果有任何疑问,可以多查阅文档或者咨询经验丰富的开发者。