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 的生效范围。
相关推荐
zjshuster3 小时前
流程引擎(Process Engine)简介
java·数据库·servlet
xinzheng新政20 小时前
Javascript 深入学习基础·4
javascript·学习·servlet
身如柳絮随风扬1 天前
Servlet:访问流程、核心接口与生命周期
java·servlet·web
:1211 天前
请求对象响应对象2
servlet
ruan1145141 天前
关于HashMap--个人学习记录
java·jvm·servlet
凌冰_2 天前
Servlet+Thymeleaf + Fetch 实现无刷新异步请求
java·servlet
椰猫子2 天前
Javaweb(Servlet)
servlet
如若1233 天前
ERROR:pdf2zh.converter:‘str‘ object has no attribute ‘choices‘ converter.py:357
java·开发语言·servlet
:1213 天前
servlet
servlet