讲解java中基于Session实现登录的流程

🌐 一、什么是 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,保存用户信息

登录成功后,后端调用 HttpServletRequestgetSession() 方法获取 HttpSession,并存储用户信息:

java 复制代码
HttpSession session = request.getSession();
session.setAttribute("user", user);

注意:此时服务器会为这个客户端分配一个唯一的 Session ID(如 JSESSIONID=ABC123XYZ),并通过响应头 Set-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)来实现高可用登录。

🧾 一、发送短信验证码流程(左侧)

  1. 开始
  2. 提交手机号:用户在前端输入手机号码提交。
  3. 校验手机号合法性:如果不合法则提示重新输入。
  4. 生成验证码:如果手机号合法,就生成一个验证码(通常是6位数字)。
  5. 保存验证码到 Session 中:将验证码以手机号为 key 存入 Session(服务端内存)。
  6. 发送验证码给用户手机(通过短信服务)。
  7. 结束流程

📌 作用: 该流程主要目的是完成服务端验证码的生成与保存,用于下一步登录验证。


🔐 二、验证码登录与注册流程(中间)

  1. 开始

  2. 提交手机号和验证码(用户收到验证码后填入并提交)

  3. 校验验证码:从 Session 中取出对应手机号的验证码进行比对

    • 不一致 → 返回失败,要求重新输入
    • 一致 → 进入下一步
  4. 根据手机号查询用户:从数据库中查询该手机号是否已注册

  5. 用户是否存在?

    • 不存在 → 创建新用户,并保存用户信息到数据库
  6. 将用户信息保存到 Session(作为登录状态的标志)

  7. 结束流程

📌 作用: 这是登录的主流程,用户信息一旦写入 Session,表示已登录。


✅ 三、校验登录状态流程(右侧)

  1. 开始

  2. 请求并携带 cookie:客户端请求时会自动携带 cookie(里面包含 Session ID)

  3. 从 Session 中获取用户信息:根据 Session ID 找到服务端对应的 Session,再取出用户信息

  4. 判断用户是否存在?

    • 不存在 → 拦截请求,返回未登录错误
    • 存在 → 表示已登录
  5. 保存用户到 ThreadLocal:便于后续业务逻辑(如获取当前用户)

  6. 放行请求

  7. 结束流程

📌 作用: 这是在用户访问需要登录权限的接口时,用来校验其是否登录的过程。


🔁 总结:Session 实现登录的核心思路

  • ✅ 登录状态 保存在服务端的 Session 中
  • ✅ 前端只需通过 Cookie 自动携带 SessionID;
  • ✅ 服务端可随时从 Session 中取出登录用户信息;
  • ✅ 缺点:Session 数据保存在内存,不适合分布式系统(需做 Session 共享或替代方案,如 Redis)。
相关推荐
我命由我1234518 小时前
Python 开发问题:No Python interpreter configured for the project
开发语言·后端·python·学习·pycharm·学习方法·python3.11
闲云一鹤18 小时前
Claude Code 接入第三方AI模型(MiMo-V2-Flash)
前端·后端·claude
shiwulou118 小时前
如何在 Windows 中使用 Kimi CLI
后端
开心就好202518 小时前
iOS 抓包工具在不同场景的实际作用
后端
廋到被风吹走18 小时前
【Spring】核心类研究价值排行榜
java·后端·spring
czlczl2002092518 小时前
SpringBoot实践:从验证码到业务接口的完整交互生命周期
java·spring boot·redis·后端·mysql·spring
天天摸鱼的java工程师19 小时前
Kafka 消息积压处理实战:百万级队列清空的优化技巧
java·后端
seekCat19 小时前
WPF中的IValueConverter接口(值转换器)
后端
Wyy_9527*19 小时前
Spring三种注入方式对比
java·后端·spring
一个大专生的淘汰之路19 小时前
Elasticsearch 中的 term的查询
后端