Session 会话管理
本指南介绍如何在 Feat Cloud 中使用 Session 管理用户状态,包括本地 Session 和 Redis Session 两种模式。
使用本地 Session
Section titled “使用本地 Session”本地 Session 是默认模式,适用于单机部署场景。
在 Controller 方法中注入 Session 参数即可使用:
@Controllerpublic 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 IDString sessionId = session.getSessionId();
// 销毁 Sessionsession.invalidate();使用 Redis Session
Section titled “使用 Redis Session”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>配置 Redis
Section titled “配置 Redis”在 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 完全一致:
@Controllerpublic 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"; }}Session API 参考
Section titled “Session API 参考”| 方法 | 说明 |
|---|---|
put(String key, String value) | 存储键值对到 Session |
get(String key) | 从 Session 获取值 |
invalidate() | 销毁当前 Session |
setTimeout(int seconds) | 设置 Session 超时时间 |
getTimeout() | 获取 Session 超时时间 |
getSessionId() | 获取 Session ID |
选择 Session 模式
Section titled “选择 Session 模式”| 模式 | 适用场景 | 特点 |
|---|---|---|
| 本地 Session | 单机部署 | 简单快速,无需外部依赖 |
| Redis Session | 集群部署 | 支持分布式,数据持久化 |
1. 只存储必要信息
Section titled “1. 只存储必要信息”// 推荐:只存储关键标识session.put("userId", "12345");session.put("username", "john");
// 不推荐:避免存储大对象session.put("userProfile", largeUserProfileObject);2. 及时清理 Session
Section titled “2. 及时清理 Session”@RequestMapping("/logout")public String logout(Session session) { session.invalidate(); // 登出时清除 Session return "Logged out";}3. 设置合理的超时时间
Section titled “3. 设置合理的超时时间”# 敏感应用(如银行系统):较短时间server: session: timeout: 900 # 15分钟
# 普通应用:适中时间server: session: timeout: 1800 # 30分钟
# 低敏感应用:较长时间server: session: timeout: 86400 # 24小时4. 避免存储敏感信息
Section titled “4. 避免存储敏感信息”// 不推荐:存储密码等敏感信息session.put("password", userPassword);
// 推荐:只存储用户标识session.put("userId", userId);Session 丢失
Section titled “Session 丢失”原因:使用本地 Session 但部署了多个实例。
解决方案:切换到 Redis Session 模式。
Session 超时过快
Section titled “Session 超时过快”原因:默认超时时间设置较短。
解决方案:在配置中增加 timeout 值。
Redis 连接失败
Section titled “Redis 连接失败”原因:Redis 配置错误或 Redis 服务未启动。
解决方案:检查 feat.yml 中的 Redis 配置,确保 Redis 服务正常运行。