Session 会话管理
This content is not available in your language yet.
会话(Session)是Web应用中用来跟踪用户状态的机制。HTTP协议本身是无状态的,Session允许我们在多个请求之间保存用户信息。
本地Session (默认)
Section titled “本地Session (默认)”Feat默认使用本地Session,适用于单机部署:
@Controllerpublic 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 (集群)
Section titled “Redis Session (集群)”对于集群部署,使用Redis存储Session:
- 添加依赖到
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>- 配置
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数据库索引- 使用方式与本地Session相同:
@Controllerpublic 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
Section titled “Session API”无论使用哪种存储方式,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”graph TD
A[用户请求] --> B{Cookie中有Session ID?}
B -->|是| C[从内存中获取Session]
B -->|否| D[创建新Session]
C --> E[处理业务逻辑]
D --> E
E --> F[返回响应]
Redis Session
Section titled “Redis Session”graph TD
A[用户请求] --> B{Cookie中有Session ID?}
B -->|是| C[从Redis获取Session]
B -->|否| D[创建新Session]
C --> E[处理业务逻辑]
D --> E
E --> F[返回响应]
- 只存储必要信息:
// 推荐:只存储关键信息session.put("userId", "12345");session.put("username", "john");
// 不推荐:存储大对象session.put("userProfile", largeUserProfileObject);- 及时清理Session:
@RequestMapping("/logout")public String logout(Session session) { session.invalidate(); // 登出时清除Session return "Logged out";}- 设置合适超时时间:
# 敏感应用设置较短时间server: session: timeout: 1800 # 30分钟
# 不敏感应用可设置较长时间server: session: timeout: 86400 # 24小时- 本地Session:简单快速,适合单机部署
- Redis Session:支持集群,适合分布式部署
- API一致:切换存储方式不需要修改业务代码
- 合理使用:只存储必要信息,及时清理过期Session