966 字
约 3 分钟
1
Session 有状态登录入门

Session 有状态登录入门

Session 是传统 Web 系统里非常常见的一种登录认证方式。

核心思想:

用户登录成功后,服务器保存一份登录状态,客户端只保存一个 sessionId,之后每次请求通过这个 sessionId 找到当前用户。


1. 为什么叫“有状态”?

用户登录:

用户名 + 密码
      ↓
   Server
      ↓
验证成功
      ↓
创建 Session

服务器保存:

sessionId = abc123

userId = 1001
username = zhangsan
role = admin

客户端只拿到:

sessionId = abc123

以后请求:

Cookie:

JSESSIONID=abc123

服务器:

sessionId
   ↓
查询 Session
   ↓
找到 userId = 1001
   ↓
确认当前用户

因为服务器需要保存:

这个用户已经登录

所以称为:

Stateful Authentication

有状态认证

2. Session 登录流程

用户登录
   ↓
POST /login
   ↓
验证账号密码
   ↓
创建 Session
   ↓
生成 sessionId
   ↓
通过 Cookie 返回客户端

例如:

Set-Cookie:

JSESSIONID=abc123

浏览器后续会自动携带:

Cookie:

JSESSIONID=abc123

服务器根据这个 ID 获取登录用户。


3. Session 数据存在哪里?

最简单的方式:

Spring Boot JVM 内存

例如:

Server

abc123 → User 1001

xyz789 → User 1002

但是如果部署多个服务实例:

Server A
Server B
Server C

就可能出现问题。

例如:

登录请求
   ↓
Server A
   ↓
Session 保存在 A

下一次请求:

用户请求
   ↓
Server B

Server B:

找不到这个 Session

于是生产环境通常会使用:

Redis Session

架构变成:

Server A ──┐
Server B ──┼── Redis
Server C ──┘

所有服务器共享同一份登录状态。


4. Session 怎么退出登录?

Session 的优势之一就是:

容易主动失效

用户退出:

POST /logout

服务器:

找到 Session
   ↓
删除 Session
   ↓
sessionId 失效

例如:

abc123 → User 1001

删除以后:

abc123 → 不存在

用户再次请求:

JSESSIONID=abc123

服务器发现:

Session 不存在

直接要求重新登录。


5. Session 和 JWT 的区别

Session JWT
有状态 通常无状态
登录状态保存在服务器 Token 保存在客户端
客户端保存 sessionId 客户端保存 JWT
服务端需要查 Session 服务端验证 Token
主动踢下线简单 Token 主动失效相对复杂
单体 Web 很常见 API、微服务很常见

最核心的区别就是:

Session:

服务器记住你是谁

而:

JWT:

客户端每次主动告诉服务器自己是谁

6. Session 什么时候使用?

Session 很适合:

传统 Web 项目
后台管理系统
单体应用
服务端渲染项目
需要方便踢用户下线的系统

例如:

Spring MVC
+
Thymeleaf
+
Session

就是非常经典的组合。


7. 总结

Session 登录可以简单理解成:

用户登录
   ↓
服务器创建 Session
   ↓
返回 sessionId
   ↓
客户端保存 Cookie
   ↓
每次请求携带 sessionId
   ↓
服务器查询 Session
   ↓
确认当前用户

一句话总结:

Session 有状态登录,就是把用户的登录状态保存在服务器,客户端只携带一个 sessionId,服务器通过 sessionId 找到当前用户。

也可以直接记:

Session
=
服务器保存登录状态

JWT
=
客户端携带登录凭证
Session 有状态登录入门
http://clxhxhhr.top/posts/566/
作者
clxstart
发布于
2026-09-11
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。