Skip to content

Session 会话管理

This content is not available in your language yet.

会话(Session)是Web应用中用来跟踪用户状态的机制。HTTP协议本身是无状态的,Session允许我们在多个请求之间保存用户信息。

Feat默认使用本地Session,适用于单机部署:

@Controller
public class Bootstrap {
@RequestMapping("/")
public String helloWorld(Session session) {
// 获取Session中的访问计数
String visitCount = session.get("visitCount");
if (visitCount == null) {
visitCount = "0";
}
int count = Integer.parseInt(visitCount) + 1;
// 存储访问计数到Session
session.put("visitCount", String.valueOf(count));
return "Visit count: " + count;
}
}

对于集群部署,使用Redis存储Session:

  1. 添加依赖到 pom.xml:
<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>
  1. 配置 feat.yml:
server:
session:
timeout: 1800 # Session超时时间(秒)
store-type: redis # 启用Redis存储
feat:
redis:
address: redis://127.0.0.1:6379
password: # Redis密码(可选)
database: 0 # Redis数据库索引
  1. 使用方式与本地Session相同:
@Controller
public class Bootstrap {
@RequestMapping("/user")
public String userInfo(Session session) {
// 存储用户信息
session.put("username", "John");
session.put("role", "admin");
// 获取用户信息
String username = session.get("username");
return "Hello " + username;
}
@RequestMapping("/logout")
public String logout(Session session) {
// 清除Session
session.invalidate();
return "Logged out";
}
}

无论使用哪种存储方式,Session API都是一致的:

方法说明
put(String key, String value)存储键值对到Session
get(String key)从Session获取值
invalidate()销毁当前Session
setTimeout(int seconds)设置Session超时时间
getTimeout()获取Session超时时间
getSessionId()获取Session ID
graph TD A[用户请求] --> B{Cookie中有Session ID?} B -->|是| C[从内存中获取Session] B -->|否| D[创建新Session] C --> E[处理业务逻辑] D --> E E --> F[返回响应]
graph TD A[用户请求] --> B{Cookie中有Session ID?} B -->|是| C[从Redis获取Session] B -->|否| D[创建新Session] C --> E[处理业务逻辑] D --> E E --> F[返回响应]
  1. 只存储必要信息
// 推荐:只存储关键信息
session.put("userId", "12345");
session.put("username", "john");
// 不推荐:存储大对象
session.put("userProfile", largeUserProfileObject);
  1. 及时清理Session
@RequestMapping("/logout")
public String logout(Session session) {
session.invalidate(); // 登出时清除Session
return "Logged out";
}
  1. 设置合适超时时间
# 敏感应用设置较短时间
server:
session:
timeout: 1800 # 30分钟
# 不敏感应用可设置较长时间
server:
session:
timeout: 86400 # 24小时
  • 本地Session:简单快速,适合单机部署
  • Redis Session:支持集群,适合分布式部署
  • API一致:切换存储方式不需要修改业务代码
  • 合理使用:只存储必要信息,及时清理过期Session