🌐 一、什么是 Session?
Session 是服务器为每个用户会话创建的一个独立对象,用于存储用户信息。常配合 Cookie 使用,由浏览器保存一个 JSESSIONID 来标识用户是哪一个会话。
🔐 二、基于 Session 实现登录的完整流程
⬇️ 1. 用户发起登录请求
- 用户在前端页面填写用户名和密码,点击登录按钮。
- 前端将用户名和密码通过 HTTP 请求(如 POST)发送到后端的登录接口
/login。
http
POST /login
Content-Type: application/x-www-form-urlencoded
username=admin&password=123456
🧠 2. 服务端校验账号密码
后端接收到请求,通常会做以下操作:
java
// 示例伪代码
User user = userService.findByUsername(username);
if (user == null || !user.getPassword().equals(password)) {
return Result.fail("用户名或密码错误");
}
✅ 3. 登录成功,创建 Session,保存用户信息
登录成功后,后端调用 HttpServletRequest 的 getSession() 方法获取 HttpSession,并存储用户信息:
java
HttpSession session = request.getSession();
session.setAttribute("user", user);
注意:此时服务器会为这个客户端分配一个唯一的
Session ID(如JSESSIONID=ABC123XYZ),并通过响应头Set-Cookie返回给客户端。
🍪 4. 浏览器保存 JSESSIONID 到 Cookie
客户端收到响应后,浏览器会自动保存服务器返回的 Cookie:
http
Set-Cookie: JSESSIONID=ABC123XYZ; Path=/; HttpOnly
🔄 5. 用户后续请求,携带 Cookie(JSESSIONID)
以后用户每次请求服务器时,浏览器会自动在请求头中携带 JSESSIONID:
http
Cookie: JSESSIONID=ABC123XYZ
🧭 6. 服务端识别 Session,判断是否已登录
后端接收到请求,会根据 JSESSIONID 查找对应的 HttpSession,然后判断是否已登录:
java
HttpSession session = request.getSession(false); // 不自动创建
User user = (User) session.getAttribute("user");
if (user == null) {
return Result.fail("未登录");
}
🚪 7. 用户登出(注销 Session)
如果用户点击退出登录按钮,后端可以销毁 session:
java
request.getSession().invalidate();
🎯 总结流程图(文字版)
pgsql
浏览器输入账号密码
↓
POST /login
↓
后端校验账号密码
↓
校验成功 → 创建 Session 并保存 user
↓
返回响应 + Set-Cookie(JSESSIONID)
↓
浏览器保存 JSESSIONID
↓
后续请求自动携带 Cookie(JSESSIONID)
↓
服务器识别 Session → 获取 user
↓
判断是否已登录
📌 注意事项
| 项目 | 说明 |
|---|---|
| Session默认过期时间 | 30分钟 |
| Session保存在服务器 | 是(内存/缓存) |
| 安全性 | 更安全(比Cookie) |
| 是否可横向扩展 | 需使用共享Session(如Redis) |
✅ 拓展:如何防止Session失效?
- 设置
session.setMaxInactiveInterval()来延长过期时间。 - 使用分布式会话(Spring Session + Redis)来实现高可用登录。

🧾 一、发送短信验证码流程(左侧)
- 开始
- 提交手机号:用户在前端输入手机号码提交。
- 校验手机号合法性:如果不合法则提示重新输入。
- 生成验证码:如果手机号合法,就生成一个验证码(通常是6位数字)。
- 保存验证码到 Session 中:将验证码以手机号为 key 存入 Session(服务端内存)。
- 发送验证码给用户手机(通过短信服务)。
- 结束流程
📌 作用: 该流程主要目的是完成服务端验证码的生成与保存,用于下一步登录验证。
🔐 二、验证码登录与注册流程(中间)
-
开始
-
提交手机号和验证码(用户收到验证码后填入并提交)
-
校验验证码:从 Session 中取出对应手机号的验证码进行比对
- 不一致 → 返回失败,要求重新输入
- 一致 → 进入下一步
-
根据手机号查询用户:从数据库中查询该手机号是否已注册
-
用户是否存在?
- 不存在 → 创建新用户,并保存用户信息到数据库
-
将用户信息保存到 Session(作为登录状态的标志)
-
结束流程
📌 作用: 这是登录的主流程,用户信息一旦写入 Session,表示已登录。
✅ 三、校验登录状态流程(右侧)
-
开始
-
请求并携带 cookie:客户端请求时会自动携带 cookie(里面包含 Session ID)
-
从 Session 中获取用户信息:根据 Session ID 找到服务端对应的 Session,再取出用户信息
-
判断用户是否存在?
- 不存在 → 拦截请求,返回未登录错误
- 存在 → 表示已登录
-
保存用户到 ThreadLocal:便于后续业务逻辑(如获取当前用户)
-
放行请求
-
结束流程
📌 作用: 这是在用户访问需要登录权限的接口时,用来校验其是否登录的过程。
🔁 总结:Session 实现登录的核心思路
- ✅ 登录状态 保存在服务端的 Session 中;
- ✅ 前端只需通过 Cookie 自动携带 SessionID;
- ✅ 服务端可随时从 Session 中取出登录用户信息;
- ✅ 缺点:Session 数据保存在内存,不适合分布式系统(需做 Session 共享或替代方案,如 Redis)。