Cookie和Session
一、HTTP 是无状态的
HTTP 协议本身是“无状态”的:每次请求都是独立的,服务器不记得你是谁。
比如你第一次请求登录页面,输入账号密码;第二次请求论坛页面,服务器不知道刚才登录的人就是你。
为了让服务器“记住”你,就需要 Cookie 和 Session。
二、Cookie 是什么?
Cookie 是浏览器里存储的一小段文本,由服务器通过 Set-Cookie 响应头发给浏览器,浏览器在之后每次请求该网站时自动带上。
-
存储位置:浏览器本地(内存或硬盘)。
-
大小限制:通常 4KB。
-
内容:键值对,例如
SESSION=abc123。
Cookie 的生命周期
| 类型 | 如何设置 | 存储位置 | 消失时机 |
|---|---|---|---|
| 会话 Cookie | 不设置 Max-Age 或 Expires |
内存 | 关闭浏览器进程 |
| 持久 Cookie | 设置 Max-Age(如 3600 秒) |
硬盘 | 到达过期时间 |
注意:关闭单个标签页不会让任何 Cookie 消失,只有关闭整个浏览器进程(所有窗口)才会清空会话 Cookie。
三、Session 是什么?
Session 是服务器端存储的用户数据,比如登录状态、用户ID、购物车内容等。
-
存储位置:服务器内存(传统方式)或 Redis/数据库(分布式)。
-
内容:可以是任意 Java 对象(User、Map、List 等)。
-
标识:每个 Session 有一个唯一的 ID(如
abc123)。
Session 的生命周期
-
创建:第一次调用
request.getSession()时生成。 -
销毁:
-
主动调用
session.invalidate()(退出登录)。 -
超过设定的超时时间(如
spring.session.timeout=1800s)。 -
服务器重启(如果存在 Redis 则不受影响)。
-
四、Cookie 和 Session 如何配合工作?
典型流程(你项目里的 Spring Session + Redis):
-
用户登录
-
浏览器发送
POST /login,携带账号密码。 -
服务器验证成功,创建一个 Session 对象(包含用户信息),并生成一个唯一的 Session ID(例如
session_123)。 -
服务器将这个 Session 存储到 Redis(key =
spring:session:sessions:session_123,value = 用户数据)。 -
服务器响应时,在响应头中加入:
text
Set-Cookie: SESSION=session_123; Path=/; HttpOnly
-
浏览器收到后,把这个 Cookie 保存在内存中(因为没有设置过期时间,所以是会话 Cookie)。
-
-
用户访问论坛页面
-
浏览器自动在请求头中带上:
text
Cookie: SESSION=session_123
-
服务器收到请求,从 Cookie 中取出
session_123。 -
服务器去 Redis 里查找 key 为
session_123的数据。 -
找到了 → 说明用户已登录 → 返回论坛页面。
-
找不到(过期或没登录过)→ 返回登录页。
-
-
用户退出登录
-
浏览器发送
GET /logout。 -
服务器从 Redis 中删除该 Session 数据,并在响应头中设置:
text
Set-Cookie: SESSION=; Max-Age=0
-
浏览器收到后,立即删除本地的
SESSIONCookie。
-
-
Session 超时
-
用户停止操作超过 30 分钟(你的配置)。
-
Redis 自动删除该 Session 数据。
-
下次浏览器即使还带着旧的
SESSION=session_123Cookie,服务器查不到数据,也会要求重新登录。
-
五、回答困惑
Q:为什么从一个页面跳转到另一个页面,Cookie 保持不变?
A:因为浏览器每次请求同一域名下的页面,都会自动带上该域名下所有未过期的 Cookie。这是浏览器内置的行为,不需要你写任何代码。
Q:为什么我叉掉所有本项目页面,再打开就要重新登录?
A:有两种可能:
-
你叉掉的是最后一个浏览器窗口 → 浏览器进程退出 → 会话 Cookie(存在内存)丢失 → 需要重新登录。
-
你叉掉所有标签页但浏览器进程还在(例如 Chrome 还在后台),那其实是 Session 超时 了(你离开太久了),而不是 Cookie 丢了。
Q:叉掉全部页面后还能保持登录,是不是太危险了?
A:是的,如果这是公共电脑,别人打开浏览器直接进你的账号就很危险。
解决方案:
-
用完网站后主动点击“退出登录”。
-
设置更短的 Session 超时时间(如 5 分钟)。
-
要求用户使用隐私/无痕模式(关闭最后一个无痕标签页自动清除所有数据)。
六、总结一句话
-
Cookie 是浏览器的身份证(只存 ID)。
-
Session 是服务器的档案柜(存用户数据)。
-
浏览器拿着 Cookie 里的 ID 去问服务器:我的数据在哪个柜子里?服务器去 Redis 里找,找到就认你是本人。
回答由 AI 生成,内容仅供参考,请仔细甄别。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)