Featured image of post Web开发-Session会话跟踪技术

Web开发-Session会话跟踪技术

860字

Session 会话跟踪技术学习笔记

一、Session 基本概念

  • 本质:服务器端会话跟踪技术,存储在服务端
  • 底层实现:基于 Cookie 机制实现

二、Session 工作流程

1. 获取Session

首次请求时:

  • 服务器检查是否存在Session对象
  • 不存在则自动创建新Session对象
  • 每个Session对象都有唯一ID(如示意图中的Session(1)

关键点:Session对象由服务器自动创建维护

2. 响应Cookie (JSESSIONID)

响应阶段:

  • 服务器通过响应头Set-Cookie返回Session ID
  • 固定Cookie名JSESSIONID=会话ID值
  • 浏览器自动存储该Cookie
1
2
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=123456789

3. 查找Session

后续请求时:

  1. 浏览器自动携带JSESSIONID Cookie
  2. 服务器通过ID查找对应Session对象
  3. 实现同会话多次请求间的数据共享

三、代码测试验证

测试接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@Slf4j
@RestController
public class SessionController {
    
    // 存储数据到Session
    @GetMapping("/s1")
    public Result session1(HttpSession session){
        session.setAttribute("loginUser", "tom"); 
        return Result.success();
    }

    // 从Session获取数据
    @GetMapping("/s2")
    public Result session2(HttpServletRequest request){
        HttpSession session = request.getSession();
        Object loginUser = session.getAttribute("loginUser");
        return Result.success(loginUser);
    }
}

测试结果

  1. 首次访问/s1

    • 响应头出现 Set-Cookie: JSESSIONID=xxx
    • 服务器创建新Session
  2. 后续访问/s2

    • 请求头携带 Cookie: JSESSIONID=xxx
    • 验证成功
      • 两次请求获取的Session对象hashcode相同
      • 能正确获取之前存储的loginUser数据

四、Session的优缺点

✅ 优点

  • 安全性高:数据存储在服务端

❌ 缺点

  • 集群环境失效:多台服务器间Session不共享
  • 移动端限制:Android/IOS无法使用Cookie
  • 用户行为影响
    • 可能禁用Cookie
    • Cookie有跨域限制

核心问题:Session依赖Cookie机制,当Cookie不可用时整个方案失效

五、集群环境问题详解

典型部署架构

1
用户 -> 负载均衡服务器 -> [Tomcat1, Tomcat2, Tomcat3]

问题场景

  1. 用户登录请求被路由到Tomcat1

    • 创建SessionA(ID=123)
  2. 查询请求被路由到Tomcat2

    • 携带JSESSIONID=123
    • 但Tomcat2不存在该Session → 会话中断

根本原因

Session数据未在集群间同步,导致:

  • 同一用户多次请求可能访问不同服务器
  • 各服务器Session存储相互独立
如对内容有异议,请联系关邮箱2285786274@qq.com修改