讲师中心 微信公众号
AI工具推荐 视频效率加速

Java Web 中的会话跟踪:深入理解 Cookie 的原理与实践

陌芳小哥_3623

陌芳小哥_3623

发布时间:2026-07-31 18:11:22

|

937人浏览过

|

来源于php中文网

原创

Java Web 中的会话跟踪:深入理解 Cookie 的原理与实践

本文系统讲解 http 无状态协议下如何通过 cookie 实现客户端会话跟踪,涵盖 cookie 创建、发送、读取、属性设置及典型应用场景,强调以手机号等自然标识替代 session id 的设计思路,并提供可运行的 java servlet 示例代码。

本文系统讲解 http 无状态协议下如何通过 cookie 实现客户端会话跟踪,涵盖 cookie 创建、发送、读取、属性设置及典型应用场景,强调以手机号等自然标识替代 session id 的设计思路,并提供可运行的 java servlet 示例代码。

在 Web 开发中,“会话”(Session)并非物理连接,而是逻辑概念:从用户打开浏览器首次访问服务器起,到关闭浏览器为止,其间发生的多次请求-响应交互构成一次会话。由于 HTTP 协议本身是无状态的——每次请求对服务器而言都是全新的、彼此独立的——服务器无法天然识别“这两次请求是否来自同一用户”。因此,必须借助会话跟踪技术,在多次请求间维持用户上下文,例如登录态、购物车内容或个性化偏好。

目前主流的会话跟踪方案分为两类:客户端存储型(Cookie) 和 服务端存储型(Session)。其中,Cookie 是最基础、最轻量且无需服务端额外资源的实现方式:它由服务器生成并写入客户端浏览器(或短信终端等 HTTP 客户端),后续请求自动携带该数据回传,从而让服务器得以识别用户身份或恢复会话状态。

✅ Cookie 的核心工作流程

  1. 服务器创建并下发 Cookie
    使用 javax.servlet.http.Cookie 构造器创建键值对,并通过 HttpServletResponse.addCookie() 发送至客户端:

    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            String phone = req.getParameter("phone"); // 如 +8613800138000
            Cookie userCookie = new Cookie("user_phone", phone);
            userCookie.setPath("/");              // 全站有效
            userCookie.setMaxAge(7 * 24 * 3600); // 持久化保存 7 天(秒)
            userCookie.setHttpOnly(true);        // 禁止 JS 访问,提升安全性
            userCookie.setSecure(true);          // 仅 HTTPS 传输(生产环境必需)
            resp.addCookie(userCookie);
    
            resp.getWriter().print("Login OK");
        }
    }
  2. 客户端自动回传 Cookie
    浏览器在后续对同域路径的请求中,自动将匹配 path 和 domain 的 Cookie 放入 Cookie 请求头(如 Cookie: user_phone=%2B8613800138000),无需前端额外编码。

  3. 服务器读取并解析 Cookie
    通过 HttpServletRequest.getCookies() 获取所有 Cookie 数组,遍历匹配名称提取值:

    @WebServlet("/profile")
    public class ProfileServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            Cookie[] cookies = req.getCookies();
            String phone = null;
            if (cookies != null) {
                for (Cookie c : cookies) {
                    if ("user_phone".equals(c.getName())) {
                        phone = c.getValue(); // 解码后为原始手机号
                        break;
                    }
                }
            }
    
            if (phone == null) {
                resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Not logged in");
                return;
            }
    
            // 基于手机号查询用户资料(如从数据库或缓存)
            String profile = getUserProfileByPhone(phone);
            resp.getWriter().print("Welcome, " + profile);
        }
    }

⚠️ 关键注意事项与最佳实践

  • 不依赖 HttpSession 或 Cookie 存储敏感信息:Cookie 明文存储于客户端,易被窃取或篡改。切勿存放密码、Token 或支付凭证;推荐仅存非敏感标识(如脱敏手机号、只读用户ID),敏感状态应由服务端 Session/Redis 管理。
  • 明确区分“会话标识”与“业务标识”:示例中使用 user_phone 而非默认 JSESSIONID,正是为了以自然业务键(手机号)替代抽象会话键——这更符合短信场景(如 Twilio 回调中 From 参数即天然唯一标识),避免引入 HttpSession 及其依赖的 Cookie 机制,提升架构清晰度与可测试性。
  • 合理设置生命周期:setMaxAge(0) 表示删除 Cookie;setMaxAge(-1)(默认)表示会话级 Cookie(关闭浏览器即失效);正整数值表示秒级持久化时间。生产环境务必显式设置,避免意外长期驻留。
  • 路径与域控制作用范围:setPath("/admin") 仅使该 Cookie 在 /admin/* 下发送;setDomain(".example.com") 支持子域名共享(如 api.example.com 和 www.example.com)。
  • 中文与特殊字符需编码:Cookie 值不支持 UTF-8 直接存储,须使用 URLEncoder.encode(value, "UTF-8") 编码,读取时用 URLDecoder.decode(cookie.getValue(), "UTF-8") 解码。

? 总结:为什么用手机号,而不用 Cookie 或 Session?

正如问题所洞察——在短信通信(如 Twilio 场景)中,From 字段(发送方手机号)本身就是强唯一、不可伪造、天然稳定的会话标识符。此时强行引入 HttpSession 并依赖 Cookie 维护会话 ID,不仅增加复杂度(需处理 Cookie 过期、跨域、安全属性),更违背了“以业务实体为中心”的设计原则。正确做法是:直接提取 request.getParameter("From") 作为会话主键,结合 Redis 或数据库持久化用户上下文,彻底解耦会话管理与传输层机制。Cookie 在此场景中,仅作为可选的辅助手段(如 Web 端同步登录态),而非会话跟踪的必要依赖。

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载

掌握 Cookie 的本质——它是 HTTP 协议层的标准化键值传递机制,而非某种“必须配合 Session 使用”的附属品——才能真正写出清晰、健壮、面向业务的会话管理代码。

立即学习“Java免费学习笔记(深入)”;

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

12017

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9102

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7792

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1264

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1028

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1516

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3149

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20391

2023.08.03

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn