一、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):

  1. 用户登录

    • 浏览器发送 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)。

  2. 用户访问论坛页面

    • 浏览器自动在请求头中带上:

      text

      Cookie: SESSION=session_123
    • 服务器收到请求,从 Cookie 中取出 session_123

    • 服务器去 Redis 里查找 key 为 session_123 的数据。

    • 找到了 → 说明用户已登录 → 返回论坛页面。

    • 找不到(过期或没登录过)→ 返回登录页。

  3. 用户退出登录

    • 浏览器发送 GET /logout

    • 服务器从 Redis 中删除该 Session 数据,并在响应头中设置:

      text

      Set-Cookie: SESSION=; Max-Age=0
    • 浏览器收到后,立即删除本地的 SESSION Cookie。

  4. Session 超时

    • 用户停止操作超过 30 分钟(你的配置)。

    • Redis 自动删除该 Session 数据。

    • 下次浏览器即使还带着旧的 SESSION=session_123 Cookie,服务器查不到数据,也会要求重新登录。


五、回答困惑

Q:为什么从一个页面跳转到另一个页面,Cookie 保持不变?

A:因为浏览器每次请求同一域名下的页面,都会自动带上该域名下所有未过期的 Cookie。这是浏览器内置的行为,不需要你写任何代码。

Q:为什么我叉掉所有本项目页面,再打开就要重新登录?

A:有两种可能:

  • 你叉掉的是最后一个浏览器窗口 → 浏览器进程退出 → 会话 Cookie(存在内存)丢失 → 需要重新登录。

  • 你叉掉所有标签页但浏览器进程还在(例如 Chrome 还在后台),那其实是 Session 超时 了(你离开太久了),而不是 Cookie 丢了。

Q:叉掉全部页面后还能保持登录,是不是太危险了?

A:是的,如果这是公共电脑,别人打开浏览器直接进你的账号就很危险。
解决方案:

  • 用完网站后主动点击“退出登录”

  • 设置更短的 Session 超时时间(如 5 分钟)。

  • 要求用户使用隐私/无痕模式(关闭最后一个无痕标签页自动清除所有数据)。


六、总结一句话

  • Cookie 是浏览器的身份证(只存 ID)。

  • Session 是服务器的档案柜(存用户数据)。

  • 浏览器拿着 Cookie 里的 ID 去问服务器:我的数据在哪个柜子里?服务器去 Redis 里找,找到就认你是本人。

回答由 AI 生成,内容仅供参考,请仔细甄别。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐