跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring MVC 中 Cookie 与 Session 机制详解

Spring MVC 中 Cookie 与 Session 的概念、区别及使用。介绍了 HTTP 无状态特性,Session 作为服务器端存储会话信息的哈希表机制,以及两者在安全性、容量、生命周期上的差异。提供了通过 HttpServletRequest 及注解方式获取和设置 Cookie、Session 及请求头(如 User-Agent)的代码示例。

菩提发布于 2026/3/30更新于 2026/10/21107 浏览
Spring MVC 中 Cookie 与 Session 机制详解

获取 Cookie/Session

理解 Cookie

HTTP 协议自身是'无状态'协议,但是在实际开发中,我们很多时候是需要知道请求之间的关联关系的。

上述图中的'令牌'通常就存储在 Cookie 字段中。此时在服务器这边就需要记录'令牌'信息,以及令牌对应的用户信息,这个就是 Session 机制所做的工作。

理解 Session

我们先来了解一下什么是会话。会话:对话的意思。

在计算机领域,会话是一个客户与服务器之间的不中断的请求响应。对客户的每个请求,服务器能够识别出请求来自于同一个客户。当一个未知的客户向 Web 应用程序发送第一个请求时就开始了—个会话。当客户明确结束会话或服务器在一个时限内没有接受到客户的任何请求时,会话就结束了。

服务器同一时刻收到的请求是很多的。服务器需要清楚的区分每个请求是从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系。

Session 是服务器为了保存用户信息而创建的一个特殊的对象。

Session 的本质就是一个'哈希表',存储了一些键值对结构。Key 就是 SessionID,Value 就是用户信息(用户信息可以根据需求灵活设计)。

SessionId 是由服务器生成的一个'唯一性字符串',从 Session 机制的角度来看,这个唯一性字符串称为'SessionId'。但是站在整个登录流程中看待,也可以把这个唯一性字符串称为'token'。 上述例子中的令牌 ID,就可以看做是 SessionId,只不过令牌除了 ID 之外,还会带一些其他信息,比如时间,签名等。

  1. 当用户登陆的时候,服务器在 Session 中新增一个新记录,并把 sessionId 返回给客户端。(通过 HTTP 响应中的 Set-Cookie 字段返回)。
  2. 客户端后续再给服务器发送请求的时候,需要在请求中带上 sessionId。(通过 HTTP 请求中的 Cookie 字段带上)。
  3. 服务器收到请求之后,根据请求中的 sessionId 在 Session 信息中获取到对应的用户信息,再进行后续操作。找不到则重新创建 Session,并把 SessionID 返回。

Session 默认是保存在内存中的。如果重启服务器则 Session 数据就会丢失。

Cookie 和 Session 的区别

  • Cookie 是客户端保存用户信息的一种机制。Session 是服务器端保存用户信息的一种机制。
  • Cookie 和 Session 之间主要是通过 SessionId 关联起来的,SessionId 是 Cookie 和 Session 之间的桥梁。
  • Cookie 和 Session 经常会在—起配合使用。但是不是必须配合。
  • 完全可以用 Cookie 来保存一些数据在客户端。这些数据不一定是用户身份信息,也不一定是 SessionId。
  • Session 中的 sessionId 也不需要非得通过 Cookie/Set-Cookie 传递,比如通过 URL 传递。
  1. 存储位置
    • Cookie:存储在客户端(浏览器)上。当服务器响应一个 HTTP 请求时,它可以在响应头中包含一个 Set-Cookie 字段,浏览器会保存这个 Cookie,并在后续的请求中通过 Cookie 请求头将 Cookie 发送回服务器。
    • Session:存储在服务器端。服务器为每个用户会话创建一个唯一的标识符(通常是 Session ID),这个标识符被发送到客户端(通常是通过 Cookie,但也可以通过 URL 重写等方式),客户端在后续的请求中携带这个标识符,服务器通过这个标识符来识别用户会话。
  2. 安全性
    • Cookie:由于存储在客户端,因此相对容易受到攻击,如跨站脚本攻击(XSS)可以读取或修改 Cookie。但是,可以通过设置 HttpOnly 和 Secure 标志来增加安全性,HttpOnly 标志可以防止 JavaScript 访问 Cookie,Secure 标志则要求 Cookie 仅通过 HTTPS 发送。
    • Session:存储在服务器端,因此相对更安全。但是,如果 Session ID 被泄露(例如,通过 URL 重写并泄露在日志中),则可能面临会话劫持的风险。
  3. 容量限制
    • Cookie:由于存储在客户端,其大小受到浏览器和服务器设置的限制。大多数浏览器对每个 Cookie 的大小和每个域名下的 Cookie 总数都有限制。
    • Session:存储在服务器端,因此其大小限制主要取决于服务器的内存和配置,通常远大于 Cookie 的限制。
  4. 生命周期
    • Cookie:可以设置过期时间(Expires/Max-Age),也可以不设置(会话 Cookie,浏览器关闭时失效)。
  • Session:通常依赖于服务器端的配置和 Session 的存储方式(如内存、数据库等)。如果服务器配置了 Session 的超时时间,则 Session 在达到超时时间后会被销毁。
  • 使用场景
    • Cookie:适用于存储少量数据,如用户偏好设置、登录状态等。由于存储在客户端,可以跨多个页面和请求持久化数据。
    • Session:适用于存储大量数据,如用户信息、购物车内容等。由于存储在服务器端,可以更安全地管理用户会话。
  • 获取 Cookie

    首先先设置 Cookie。

    再获取:

    @RequestMapping("/getC")
    public String getCookie(HttpServletRequest request) {
        // 获取参数
        // String name = request.getParameter("name");
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName() + ":" + ck.getValue()));
        }
        return "获取 Cookie";
    }
    

    更为简洁的代码:

    @RequestMapping("/getC2")
    public String getCookie2(@CookieValue("name") String name) {
        return "从 Cookie 中获取值,name:" + name;
    }
    

    获取 Session

    Session 是服务器端的机制,我们需要先存储,才能再获取。 Session 也是基于 HttpServletRequest 来存储和获取的。

    设置 Session

    @RequestMapping("/setSess")
    public String setSess(HttpServletRequest request) {
        // 从 cookie 中获取到了 sessionID,根据 sessionID 获取 Session 对象,如果没有获取到,会创建一个 session 对象
        HttpSession session = request.getSession();
        session.setAttribute("name", "zhangsan");
        return "设置 session 成功";
    }
    

    再获取:

    @RequestMapping("/getSess")
    public String getSess(HttpServletRequest request) {
        // 从 cookie 中获取到了 sessionID,根据 session 获取 Session 对象
        HttpSession session = request.getSession();
        String name = (String) session.getAttribute("name");
        return "从 session 中获取 name:" + name;
    }
    

    获取 Session 更为简洁的代码:

    @RequestMapping("/getSess2")
    public String getSess2(HttpSession session) {
        String name = (String) session.getAttribute("name");
        return "从 session 中获取 name:" + name;
    }
    
    @RequestMapping("/getSess3")
    public String getSess3(@SessionAttribute("name") String name) {
        return "从 session 中获取 name:" + name;
    }
    

    获取 Header

    获取 User-Agent
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent");
        return "从 header 中获取信息,userAgent:" + userAgent;
    }
    

    更为简洁的代码:

    @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent) {
        return "从 header 中获取信息,userAgent:" + userAgent;
    }
    

    目录

    1. 获取 Cookie/Session
    2. 理解 Cookie
    3. 理解 Session
    4. Cookie 和 Session 的区别
    5. 获取 Cookie
    6. 获取 Session
    7. 获取 Header
    8. 获取 User-Agent

    更多推荐文章

    查看全部
    • Go 语言快速入门:从环境搭建到并发实战总结
    • Python Pandas DataFrame 常用方法精讲
    • Python+Flask+Vue 在线宠物医疗预约平台的设计与实现
    • Java 开发实战:Mybatis-Plus 与 Docker 部署指南
    • Flutter eip55 库在鸿蒙系统的适配与以太坊地址校验实战
    • WebRTC 视频编码基础 (VP8/VP9/H.264/AV1)
    • 垂直 AI 大模型行业全景分析及发展趋势
    • 从零构建:使用 aiortc 实现 WebRTC 连接的实战指南
    • 基于 LLaMA-Factory 与 Stable Diffusion 的跨模态创作工作流
    • Spring AI MCP Server 集成与源码解析
    • 动态规划:粉刷房子问题
    • C++ STL 手写 String 类实现及高频易错点复盘
    • EhViewer 安卓端 E-Hentai 漫画浏览工具安装与使用教程
    • 纯 TypeScript 文本测量引擎 Pretext 突破前端布局瓶颈
    • CTFShow Web 命令执行 29-124 实战通关指南
    • 鸿蒙电商购物车全栈项目:用户管理、商品列表与购物车实现
    • Android 复刻 Apple AppStore 卡片转场动画实现详解
    • JDK 环境搭建与基础配置实战
    • SDXL Prompt Styler 提示词风格增强工具使用指南
    • Spring AI Agent 模式:利用 TodoWriteTool 解决任务遗忘

    相关免费在线工具

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online