一、核心概念
- 作用 :定义 Cookie 的有效访问路径 ,只有客户端请求的 URL 路径包含/匹配 Cookie 的 Path 时,浏览器才会把这个 Cookie 放到请求头中发送给服务器。
- 归属:服务器通过 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 的生效范围。