前言

在 JavaWeb 开发、前后端交互、面试中,HTTP、Cookie、Session是绕不开的核心知识点。 很多初学者会疑惑:为什么登录后刷新页面还能保持登录?购物车信息怎么跨页面保存? 本质就是:HTTP 无状态 + Cookie 客户端存储 + Session 服务端存储三者配合实现会话跟踪。


一、HTTP 协议:无状态是一切的根源

1. 什么是 HTTP

HTTP(超文本传输协议)是浏览器和服务器之间数据传输的通用规则,基于请求 - 响应模式:

  • 客户端(浏览器)发送请求
  • 服务器接收后返回响应
  • 一次请求对应一次响应,完成后连接断开

2. 核心特点:无状态(重点)

无状态:服务器不会记住上一次请求的用户信息,每次请求都是独立的全新请求。

举个例子:

  1. 你在网站输入账号密码登录,服务器验证成功
  2. 你刷新页面、访问其他页面,发送新的 HTTP 请求
  3. 服务器:“我不认识你了”,需要重新登录

问题:网站需要记住用户登录状态、购物车、浏览记录,怎么办? 解决方案:使用 Cookie + Session 会话跟踪技术,弥补 HTTP 无状态的缺陷。

3. HTTP 响应头与请求头的关键作用

  • 响应头:服务器返回给浏览器的信息(比如Set-Cookie
  • 请求头:浏览器发给服务器的信息(自动携带 Cookie)

二、Cookie:客户端的 “小纸条”

1. 什么是 Cookie

Cookie 是服务器发送给浏览器,存储在客户端本地的小型文本数据(键值对形式),大小限制 4KB。 浏览器后续访问同一服务器时,自动在请求头带上 Cookie,服务器通过 Cookie 识别用户。

2. Cookie 工作流程

  1. 浏览器首次访问服务器,服务器通过响应头Set-Cookie,把 Cookie 发给浏览器
  2. 浏览器接收 Cookie,保存在本地(内存 / 硬盘)
  3. 浏览器再次访问该服务器,自动携带 Cookie到请求头
  4. 服务器读取 Cookie,识别用户身份

3. Cookie 核心属性

表格

属性 作用
name=value Cookie 的键值,核心存储内容
Expires/Max-Age 过期时间:会话 Cookie(关闭浏览器失效)、持久 Cookie(长期保存)
Path 生效路径:/代表整个网站生效
Domain 生效域名
Secure 仅 HTTPS 协议传输
HttpOnly 禁止 JS 读取,防止 XSS 攻击

4. Cookie 特点

✅ 优点:存储在客户端,不占用服务器资源;浏览器自动携带,使用便捷 ❌ 缺点:安全性低,可被篡改窃取;大小受限;只能存文本;用户可手动清除 / 禁用

5. JavaWeb 代码实操(Servlet)

java

运行

// 1.服务器创建Cookie,发送给浏览器
Cookie cookie = new Cookie("username","admin");
cookie.setMaxAge(60*60); // 存活1小时
response.addCookie(cookie);

// 2.浏览器下次请求,服务器获取Cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
    for(Cookie c : cookies){
        if("username".equals(c.getName())){
            System.out.println(c.getValue());
        }
    }
}

三、Session:服务器端的 “用户档案”

1. 什么是 Session

Session 是服务器端的会话对象,存储在服务器内存 / 数据库中,用于保存用户的完整会话信息(登录状态、购物车等)。

2. Session 工作流程(和 Cookie 强绑定)

  1. 浏览器首次访问,服务器创建Session 对象,生成唯一的 SessionID
  2. 服务器通过Set-Cookie,把SessionID发给浏览器(Cookie 形式)
  3. 浏览器保存 SessionID,后续请求自动携带该 Cookie
  4. 服务器读取 SessionID,找到对应 Session,识别用户

一句话总结:Cookie 存 SessionID,Session 存真实用户数据

3. Session 生命周期

  • 创建:用户首次调用getSession()时创建
  • 销毁:
    1. 会话超时(默认 30 分钟无操作)
    2. 手动调用invalidate()销毁
    3. 服务器关闭重启

4. Session 特点

✅ 优点:安全性高(数据在服务器);存储量大;可存任意对象 ❌ 缺点:占用服务器内存;分布式环境下需共享 Session;依赖 Cookie

5. JavaWeb 代码实操(Servlet)

java

运行

// 1.获取Session,存储用户登录信息
HttpSession session = request.getSession();
session.setAttribute("loginUser","admin");

// 2.获取Session中的数据
String username = (String)session.getAttribute("loginUser");

// 3.销毁Session(退出登录)
session.invalidate();

四、Cookie 和 Session 核心区别(面试必背)

表格

对比维度 Cookie Session
存储位置 客户端(浏览器本地) 服务器端(内存 / Redis)
存储大小 最大 4KB,只能存文本 无严格限制,可存对象
安全性 低,可被窃取篡改 高,数据在服务器
生命周期 可持久化保存 会话级,浏览器关闭 / 超时销毁
资源占用 不占用服务器资源 占用服务器内存
依赖关系 可独立使用 默认依赖 Cookie 传递 SessionID

核心关系(必懂)

  1. 不是对立,是配合:Cookie 负责传递身份标识,Session 负责存储真实数据
  2. 浏览器禁用 Cookie:Session 可以通过 URL 重写传递 SessionID,保证可用

五、实际应用场景

  1. Cookie 场景:记住账号密码、网页主题设置、浏览记录
  2. Session 场景:用户登录状态、购物车、验证码、会话权限控制

六、常见面试问题总结

  1. HTTP 为什么是无状态? HTTP 每次请求响应独立,服务器不保存用户信息,无记忆功能。
  2. Cookie 和 Session 的区别? 存储位置、安全性、大小、生命周期、资源占用(对照表格背诵)。
  3. Session 依赖 Cookie 吗? 默认依赖,Cookie 存 SessionID;禁用 Cookie 可通过 URL 重写实现。
  4. Cookie 的 HttpOnly 作用? 禁止 JS 读取 Cookie,防止 XSS 跨站脚本攻击,保护 SessionID。

七、总结

  1. HTTP 无状态是问题根源,Cookie+Session 是解决方案
  2. Cookie:客户端存小数据,轻量便捷,安全性低
  3. Session:服务端存用户完整信息,安全可靠,占用服务器资源
  4. 二者配合,实现 Web 开发的会话跟踪、用户登录、状态保持
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐