跳转到内容

Session 会话管理

本指南介绍如何在 Feat Cloud 中使用 Session 管理用户状态,包括本地 Session 和 Redis Session 两种模式。

本地 Session 是默认模式,适用于单机部署场景。

在 Controller 方法中注入 Session 参数即可使用:

@Controller
public class UserController {
@RequestMapping("/visit")
public String visitCount(Session session) {
// 获取访问计数
String count = session.get("visitCount");
int visits = (count == null ? 0 : Integer.parseInt(count)) + 1;
// 存储访问计数
session.put("visitCount", String.valueOf(visits));
return "Visit count: " + visits;
}
}
// 存储数据
session.put("username", "john");
session.put("role", "admin");
// 获取数据
String username = session.get("username");
// 设置超时时间(秒)
session.setTimeout(1800); // 30分钟
// 获取 Session ID
String sessionId = session.getSessionId();
// 销毁 Session
session.invalidate();

Redis Session 适用于集群部署场景,支持 Session 在多个服务实例间共享。

pom.xml 中添加 Redis 依赖:

<dependency>
<groupId>tech.smartboot.feat</groupId>
<artifactId>feat-cloud-starter</artifactId>
<version>${feat.version}</version>
</dependency>
<dependency>
<groupId>tech.smartboot</groupId>
<artifactId>redisun</artifactId>
<version>1.2.0</version>
</dependency>

feat.yml 中配置 Redis 连接:

server:
session:
timeout: 1800 # Session 超时时间(秒)
store-type: redis # 启用 Redis 存储
feat:
redis:
address: redis://127.0.0.1:6379
password: # Redis 密码(可选)
database: 0 # Redis 数据库索引

Redis Session 的使用方式与本地 Session 完全一致:

@Controller
public class UserController {
@RequestMapping("/login")
public String login(Session session) {
// 存储用户信息
session.put("username", "John");
session.put("role", "admin");
return "Logged in";
}
@RequestMapping("/profile")
public String profile(Session session) {
// 获取用户信息
String username = session.get("username");
return "Hello " + username;
}
@RequestMapping("/logout")
public String logout(Session session) {
// 清除 Session
session.invalidate();
return "Logged out";
}
}

方法说明
put(String key, String value)存储键值对到 Session
get(String key)从 Session 获取值
invalidate()销毁当前 Session
setTimeout(int seconds)设置 Session 超时时间
getTimeout()获取 Session 超时时间
getSessionId()获取 Session ID

模式适用场景特点
本地 Session单机部署简单快速,无需外部依赖
Redis Session集群部署支持分布式,数据持久化

// 推荐:只存储关键标识
session.put("userId", "12345");
session.put("username", "john");
// 不推荐:避免存储大对象
session.put("userProfile", largeUserProfileObject);
@RequestMapping("/logout")
public String logout(Session session) {
session.invalidate(); // 登出时清除 Session
return "Logged out";
}
# 敏感应用(如银行系统):较短时间
server:
session:
timeout: 900 # 15分钟
# 普通应用:适中时间
server:
session:
timeout: 1800 # 30分钟
# 低敏感应用:较长时间
server:
session:
timeout: 86400 # 24小时
// 不推荐:存储密码等敏感信息
session.put("password", userPassword);
// 推荐:只存储用户标识
session.put("userId", userId);

原因:使用本地 Session 但部署了多个实例。

解决方案:切换到 Redis Session 模式。

原因:默认超时时间设置较短。

解决方案:在配置中增加 timeout 值。

原因:Redis 配置错误或 Redis 服务未启动。

解决方案:检查 feat.yml 中的 Redis 配置,确保 Redis 服务正常运行。