Session 会话跟踪技术学习笔记
一、Session 基本概念
- 本质:服务器端会话跟踪技术,存储在服务端
- 底层实现:基于
Cookie
机制实现
二、Session 工作流程
1. 获取Session
首次请求时:
- 服务器检查是否存在Session对象
- 不存在则自动创建新Session对象
- 每个Session对象都有唯一ID(如示意图中的
Session(1)
)
关键点:Session对象由服务器自动创建维护
2. 响应Cookie (JSESSIONID)
响应阶段:
- 服务器通过响应头
Set-Cookie
返回Session ID - 固定Cookie名:
JSESSIONID=会话ID值
- 浏览器自动存储该Cookie
|
|
3. 查找Session
后续请求时:
- 浏览器自动携带
JSESSIONID
Cookie - 服务器通过ID查找对应Session对象
- 实现同会话多次请求间的数据共享
三、代码测试验证
测试接口
|
|
测试结果
-
首次访问/s1:
- 响应头出现
Set-Cookie: JSESSIONID=xxx
- 服务器创建新Session
- 响应头出现
-
后续访问/s2:
- 请求头携带
Cookie: JSESSIONID=xxx
- 验证成功:
- 两次请求获取的Session对象
hashcode相同
- 能正确获取之前存储的
loginUser
数据
- 两次请求获取的Session对象
- 请求头携带
四、Session的优缺点
✅ 优点
- 安全性高:数据存储在服务端
❌ 缺点
- 集群环境失效:多台服务器间Session不共享
- 移动端限制:Android/IOS无法使用Cookie
- 用户行为影响:
- 可能禁用Cookie
- Cookie有跨域限制
核心问题:Session依赖Cookie机制,当Cookie不可用时整个方案失效
五、集群环境问题详解
典型部署架构
|
|
问题场景
-
用户登录请求被路由到
Tomcat1
- 创建SessionA(ID=123)
-
查询请求被路由到
Tomcat2
- 携带JSESSIONID=123
- 但Tomcat2不存在该Session → 会话中断
根本原因
Session数据未在集群间同步,导致:
- 同一用户多次请求可能访问不同服务器
- 各服务器Session存储相互独立
|
|