Cookie

一、核心概念

  1. 作用 :定义 Cookie 的有效访问路径 ,只有客户端请求的 URL 路径包含/匹配 Cookie 的 Path 时,浏览器才会把这个 Cookie 放到请求头中发送给服务器。
  2. 归属:服务器通过 Set-Cookie 响应头设置,浏览器存储后,按规则自动携带。

二、默认路径(不手动设置 setPath 时)

如果不调用 cookie.setPath(),Cookie 会使用默认路径,规则:
默认路径 = 当前项目根路径 + 当前Servlet的上一级目录

举例:

  • 项目名:cookie_demo
  • 设置 Cookie 的 Servlet 路径:/cookie_demo/servlet/BServlet
  • 则 Cookie 默认路径:/cookie_demo/servlet

后果:

只有访问 /cookie_demo/servlet 及其子路径 时,浏览器才会携带这个 Cookie;
访问项目下其他路径(如 /cookie_demo/AServlet),不会携带

三、手动设置 Path(解决跨Servlet共享)

你的需求:BServlet 设置的 Cookie,访问 AServlet 时也能携带
解决方案:把 Cookie 的 Path 设置为项目根路径,让整个项目都能共享。

两种写法

硬编码(不推荐)
固定写死项目名,项目改名就失效:
cookie.setPath("/cookie_demo");
动态编码(推荐 最佳实践)
通过 request.getContextPath() 动态获取项目根路径,适配所有项目:
// 获取当前项目根路径,拼接 / 表示整个项目生效 cookie.setPath(request.getContextPath() + "/");

四、Path 生效规则(最重要)

浏览器判断是否携带 Cookie 的规则:
当前请求的路径 包含 Cookie 设置的 Path → 自动携带 Cookie
当前请求的路径 不包含 Cookie 设置的 Path → 不携带

通俗理解:

  • Cookie 的 Path 是有效范围
  • 请求路径必须在这个范围内(更小/同级),才会带 Cookie

示例对比

|----------------------|-------------------------------|------------|----------------|
| Cookie 设置的 Path | 访问路径 | 是否携带Cookie | 原因 |
| /cookie_demo | /cookie_demo/AServlet | ✅ 是 | 请求路径包含Cookie路径 |
| /cookie_demo | /cookie_demo/servlet/BServlet | ✅ 是 | 子路径也包含 |
| /cookie_demo/servlet | /cookie_demo/AServlet | ❌ 否 | 请求路径不在范围内 |

五、完整代码示例

BServlet(设置Cookie,指定Path)

复制代码
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 创建Cookie
        Cookie cookie = new Cookie("user", "zhangsan");
        
        // 2. 核心:设置Path为项目根路径(整个项目共享)
        cookie.setPath(request.getContextPath() + "/");
        
        // 3. 可选:设置Cookie存活时间(单位:秒)
        cookie.setMaxAge(60 * 60 * 24); // 1天
        
        // 4. 响应给客户端
        response.addCookie(cookie);
        response.getWriter().write("Cookie设置成功");
    }
}

AServlet(获取Cookie)

复制代码
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取所有Cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                if ("user".equals(c.getName())) {
                    response.getWriter().write("获取到Cookie:" + c.getValue());
                }
            }
        }
    }
}

六、补充知识点

根路径 / (全局生效)
cookie.setPath("/");
作用:当前服务器下所有项目都能共享这个 Cookie(慎用,容易造成Cookie冲突)。
Path 区分大小写
路径匹配严格区分大小写,设置和访问路径必须一致。
Path 与 Domain(域名)配合

  • Domain:决定哪个域名能使用 Cookie
  • Path:决定域名下哪个路径能使用 Cookie两者共同控制 Cookie 的生效范围。
相关推荐
lv__pf6 天前
servlet与jsp
java·开发语言·servlet
风起洛阳@不良使9 天前
Servlet体系
servlet
X1A0RAN9 天前
Jenkins Pipeline 变量打印指南
运维·servlet·jenkins
sun༒10 天前
Java Web 三大组件之 Servlet:从入门到理解生命周期
java·servlet·web
IKUN家族11 天前
Spring MVC(三)
运维·服务器·spring boot·spring·servlet·java-ee
spider_xcxc11 天前
Jenkins 遇见 Argo CD:构建可靠 GitOps 流水线的实战指南
java·开发语言·servlet
上海安当技术12 天前
统一身份认证平台怎么落地?11 个异构业务系统接入 ASP 的完整实施路径
数据库·servlet·架构·kubernetes·jenkins
豆角焖肉13 天前
Servlet :生命周期、配置与实战
servlet
Dr.kangder13 天前
嵌入式软件程序分析技术:原理、方法与实战
servlet·架构·嵌入式·dsp开发
蓝斯49713 天前
微服务项目中基于 Servlet 的业务模块与 WebFlux 网关模块的 Redis 统一化配置教程
redis·servlet·微服务