一、Session 是干啥的?
Session 是 服务器记录 “用户会话状态” 的工具,简单说:
- 让服务器知道 “哪些请求来自同一个用户”;
- 能存用户专属数据(如登录状态、购物车 ),跨页面 / 请求共享。
二、Session 工作流程(结合流程图)
1. 第一次请求(用户登录)
- 浏览器:用户访问登录页面(如
login.jsp
),发送第一次请求(带用户名、密码 )。 - 服务器:验证通过后,创建 Session 对象(存用户数据,如
session.setAttribute("user", "张三")
),并生成一个唯一标识 JSESSIONID(类似 “用户身份证号”)。
2. 第一次响应(返回 JSESSIONID)
- 服务器:通过
Response
对象,把 JSESSIONID 放到 Cookie 里,随响应发送给浏览器。 - 浏览器:自动接收 Cookie,保存
JSESSIONID
(后续请求会自动带上它 )。
3. 后续请求(自动带 JSESSIONID)
- 浏览器:之后访问服务器的任何页面(如
home.jsp
、cart.jsp
),都会自动在请求里带上 Cookie 中的 JSESSIONID。 - 服务器:根据 JSESSIONID,找到对应的 Session 对象,从而识别 “这是之前登录的那个用户”,继续使用 Session 里存的数据(如用户信息、购物车 )。
三、核心关键点拆解
1. JSESSIONID 的作用
- 是 Session 的 “唯一身份证”,服务器通过它区分不同用户的 Session。
- 浏览器和服务器靠它 “认亲”:只要 JSESSIONID 一致,就认为是同一个用户的请求。
2. Cookie 的角色
- Cookie 是 浏览器存储 “小数据” 的工具,这里用来存 JSESSIONID。
- 浏览器会 “自动管理” Cookie:收到服务器发的 JSESSIONID 后,后续请求会自动带上,无需开发者手动处理。
3. Session 对象的生命周期
- 创建:用户第一次请求时,服务器自动创建(如登录成功时 )。
- 销毁:
- 用户主动退出(调用
session.invalidate()
); - 会话超时(默认 30 分钟无操作,可通过
session.setMaxInactiveInterval()
设置 ); - 服务器重启(若没做持久化,Session 会丢失 )。
- 用户主动退出(调用
四、举个实际例子(登录 → 访问首页)
-
用户登录:
- 浏览器请求
login.jsp
,提交用户名张三
、密码123
。 - 服务器验证通过,创建 Session:
<% session.setAttribute("user", "张三"); // 存用户信息到 Session String jsessionId = session.getId(); // 获取 JSESSIONID(如:ABC123) %>
- 服务器通过
Response
把JSESSIONID=ABC123
放到 Cookie,返回给浏览器。
- 浏览器请求
-
浏览器存 Cookie:
浏览器收到响应后,自动在 Cookie 里保存JSESSIONID=ABC123
。 -
访问首页:
- 浏览器请求
home.jsp
,自动带上 Cookie:JSESSIONID=ABC123。 - 服务器根据 JSESSIONID 找到对应的 Session,取出用户信息:
<% String user = (String) session.getAttribute("user"); // 张三 out.println("欢迎您:" + user); %>
- 浏览器请求
五、Session 的优缺点
优点:
- 用户状态管理方便:直接存对象(如用户信息 ),跨页面共享;
- 数据安全:Session 存在服务器端,浏览器只存 JSESSIONID,相对安全。
缺点:
- 服务器资源消耗:每个用户的 Session 都占服务器内存,用户多了会有压力;
- 依赖 Cookie:若用户禁用 Cookie,Session 会失效(需用 URL 重写等方式兼容 );
- 会话超时问题:若用户长时间不操作,Session 会过期,需重新登录。
六、总结:Session 原理的核心逻辑
Session 靠 “JSESSIONID(身份证) + Cookie(传递身份证的信使)” 实现用户会话跟踪:
- 第一次请求,服务器发 JSESSIONID 给浏览器;
- 后续请求,浏览器自动带 JSESSIONID 找服务器;
- 服务器通过 JSESSIONID 识别用户,使用 Session 里的数据。