目录一、Cookie 与 Session 核心区别客户端与服务端的分工博弈1.1 存储位置完全不同1.2 安全级别差异巨大1.3 容量与数量限制不同1.4 存储扩展性不同二、Session 完整工作原理看透会话追踪的底层流程2.1 完整执行流程三、特殊场景深度解析客户端禁用 CookieSession 还能用吗四、核心代码实战Cookie 与 Session 读写演示4.1 Cookie 操作实战代码4.2 Session 会话实战代码4.3 URL重写兼容禁用Cookie场景五、全文核心考点总结面试必背六、文末小结在 Web 开发的世界里HTTP 协议是无状态协议。每一次浏览器请求服务器都是一次全新的独立交互服务器默认无法识别客户端身份、无法记录用户的访问状态。为了解决 Web 无状态的痛点实现用户登录保持、页面状态记忆、身份持续识别Cookie 与 Session 应运而生。二者搭配组成了 Java Web 最核心的会话追踪体系是登录认证、权限保持、单点登录的底层基石。很多开发者只会无脑使用 Session 存登录态、Cookie 存本地信息却不懂二者的底层工作机制、安全差异、存储限制更不知道浏览器禁用 Cookie 后 Session 如何兼容运行。本文从原理、流程、代码、区别、特殊场景全方位拆解彻底吃透 Web 会话机制。一、Cookie 与 Session 核心区别客户端与服务端的分工博弈Cookie 和 Session 都是为了保存用户会话状态但二者的存储位置、安全级别、容量限制、扩展能力天差地别是面试高频对比考点也是业务选型的核心依据。1.1 存储位置完全不同Cookie属于客户端技术数据存储在浏览器本地完全由浏览器管理维护。Session属于服务端技术数据存储在服务器端内存、Redis、数据库由服务端程序统一管理。1.2 安全级别差异巨大Cookie 安全性低数据暴露在浏览器端用户可以随意查看、修改、伪造、删除极易造成数据篡改、盗用风险绝对不能存储密码、权限等敏感数据。Session 安全性高数据存放在服务端客户端仅持有唯一 SessionId无法直接触碰、修改服务端真实数据安全性得到极致保障。1.3 容量与数量限制不同Cookie 存在严格限制单个 Cookie 容量一般不超过 4KB单个域名下 Cookie 数量有限无法存储大量数据仅适合存储简单标识、状态字段。Session 无严格容量限制依托服务器资源存储可自由存储对象、集合、复杂数据适配各类业务状态存储。1.4 存储扩展性不同Cookie 存储形式单一只能固定存储在浏览器端无其他存储介质可选。Session 存储灵活多样原生可存服务器内存分布式场景可迁移至 Redis、数据库、缓存中间件适配集群、微服务架构。二、Session 完整工作原理看透会话追踪的底层流程很多人用了多年 Session却不知道 Session 本质依赖 Cookie 传输 SessionId。Session 的整个工作流程是一套「服务端生成、客户端携带、全程匹配」的闭环机制。2.1 完整执行流程第一步首次请求创建 Session客户端第一次访问服务器时服务器检测请求无 SessionId自动创建全新 Session 对象并生成唯一全局唯一的 SessionId。第二步返回 SessionId 存入 Cookie服务器将生成的 SessionId 以 Cookie 的形式响应给客户端浏览器自动保存该 Cookie。第三步后续请求自动携带身份客户端后续每一次请求服务器浏览器都会自动携带存有 SessionId 的 Cookie。第四步服务端匹配会话识别用户服务器根据请求携带的 SessionId精准匹配服务端存储的 Session 对象从而识别用户身份、读取用户会话数据实现状态保持。三、特殊场景深度解析客户端禁用 CookieSession 还能用吗标准答案可以正常使用。Session 的核心依赖是SessionId 的传递而非 Cookie 本身。Cookie 只是存储 SessionId 的默认载体而非唯一载体。当浏览器禁用 Cookie、无法存储 SessionId 时服务器会自动开启URL 重写机制将 SessionId 拼接在每一次请求的 URL 路径后面通过地址栏参数传递 SessionId依然可以精准匹配服务端会话保证 Session 功能正常使用。这也是早期 Java Web 项目兼容低版本浏览器、禁用 Cookie 场景的核心兼容方案。四、核心代码实战Cookie 与 Session 读写演示通过原生 Servlet 代码直观演示 Cookie 本地存储、Session 会话存储、数据获取全过程。4.1 Cookie 操作实战代码import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; WebServlet(/cookie) public class CookieServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 创建Cookie对象存储简单标识数据 Cookie cookie new Cookie(username, JavaStudy); // 设置Cookie存活时间 30分钟 cookie.setMaxAge(60 * 30); // 响应Cookie给浏览器浏览器自动保存 response.addCookie(cookie); // 2. 获取浏览器携带的所有Cookie Cookie[] cookies request.getCookies(); if (cookies ! null) { for (Cookie c : cookies) { System.out.println(Cookie名称 c.getName() Cookie值 c.getValue()); } } response.getWriter().write(Cookie设置成功); } }代码说明Cookie 数据全部下发存储在浏览器用户可自行查看修改仅适合非敏感数据。4.2 Session 会话实战代码import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; WebServlet(/session) public class SessionServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取Session对象没有则自动创建 HttpSession session request.getSession(); // 2. 存储用户会话数据服务端存储安全可靠 session.setAttribute(userId, 10001); session.setAttribute(userName, 程序开发者); // 3. 获取SessionId客户端唯一身份标识 String sessionId session.getId(); System.out.println(当前用户SessionId sessionId); // 4. 获取会话数据 String userName (String) session.getAttribute(userName); response.getWriter().write(当前登录用户 userName); } }4.3 URL重写兼容禁用Cookie场景// 自动拼接SessionId到URL兼容浏览器禁用Cookie String url response.encodeURL(/session); response.getWriter().write(a href url 刷新页面/a);核心原理encodeURL 方法会自动判断浏览器是否禁用 Cookie禁用则自动拼接 ;jsessionidxxx 到URL末尾实现无Cookie依然维持会话。五、全文核心考点总结面试必背1. Cookie 和 Session 区别Cookie 存客户端、安全性低、有容量个数限制、仅浏览器存储Session 存服务端、安全性高、存储灵活可存内存/Redis/数据库。2. Session 工作原理服务端创建 Session 生成 SessionId通过 Cookie 下发客户端客户端每次请求携带 SessionId服务端根据 ID 匹配对应会话完成用户身份识别。3. 客户端禁用 CookieSession 还能用吗可以。通过 URL 重写技术将 SessionId 拼接在请求地址中传递绕过 Cookie 限制保证 Session 正常工作。六、文末小结Cookie 是客户端的状态备忘录轻便、受限、不安全Session 是服务端的身份档案库安全、可靠、可扩展。二者相辅相成弥补了 HTTP 无状态协议的短板构建了 Web 会话追踪的完整体系。理解 Cookie 与 Session 的底层交互、适配原理、安全边界不仅能轻松应对面试更能彻底读懂登录认证、会话保持、分布式会话的底层设计思想。