在 Java Web 开发中,Cookie 的有效期分为两种:

- 会话 Cookie (Session Cookie):存活时间仅限于当前浏览器会话,当用户关闭浏览器窗口或标签页时,Cookie 会被自动删除。
- 持久化 Cookie (Persistent Cookie):可以存活更长时间,即使浏览器关闭,只要在有效期内,Cookie 仍然保存在用户的电脑上,下次访问网站时仍然有效。
下面我们详细说明如何设置这两种有效期。
会话 Cookie (默认行为)
这是 Cookie 的默认状态,当你创建一个 Cookie 对象并将其添加到响应中时,如果不进行任何特殊设置,它就是一个会话 Cookie。
特点:
- 不会设置
Expires或Max-Age属性。 - 生命周期与浏览器进程绑定,浏览器关闭,Cookie 丢失。
- 保存在浏览器的内存中,不会写入硬盘。
示例代码: 这种情况下,你只需要创建 Cookie 并发送,无需设置有效期。

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SessionCookieExample {
public void createSessionCookie(HttpServletRequest request, HttpServletResponse response) {
// 1. 创建 Cookie 对象
// 参数:cookie 的名称, cookie 的值
Cookie userCookie = new Cookie("username", "john_doe");
// 注意:这里我们没有设置 setMaxAge() 或 setExpires()
// 所以它是一个会话 Cookie
// 2. 可选:设置 Cookie 的路径
// 只有访问这个路径及其子路径时,浏览器才会携带此 Cookie
// 如果不设置,默认是当前 Servlet 的路径
userCookie.setPath("/"); // 设置为根路径,在整个网站下都有效
// 3. 将 Cookie 添加到响应中
response.addCookie(userCookie);
System.out.println("会话 Cookie 'username' 已创建。");
}
}
持久化 Cookie
要让 Cookie 在浏览器关闭后依然存在,你必须明确设置它的有效期,在 Java Servlet API 中,推荐使用 setMaxAge() 方法。
setMaxAge(int seconds) 方法
这个方法用于设置 Cookie 的存活时间(以秒为单位)。
参数 seconds 的含义:
- 正数:指定 Cookie 存活的时间(秒)。
60 * 60 * 24 * 7表示 7 天,浏览器会将 Cookie 写入硬盘,并在指定时间后自动删除。 - 零 (0):删除 Cookie,这是删除一个持久化 Cookie 的标准方法,浏览器会立即清除该 Cookie。
- 负数:这是默认值,表示这是一个会话 Cookie,浏览器关闭时即被删除。
示例代码:

创建一个有效期为 7 天的持久化 Cookie。
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public class PersistentCookieExample {
public void createPersistentCookie(HttpServletResponse response) {
// 1. 创建 Cookie 对象
Cookie themeCookie = new Cookie("userTheme", "dark_mode");
// 2. 设置 Cookie 的路径 (非常重要!)
// 确保 Cookie 在整个网站下都可用
themeCookie.setPath("/");
// 3. 设置有效期 (7天,单位:秒)
// 60秒 * 60分钟 * 24小时 * 7天
int maxAgeInSeconds = 60 * 60 * 24 * 7;
themeCookie.setMaxAge(maxAgeInSeconds);
// 4. 将 Cookie 添加到响应中
response.addCookie(themeCookie);
System.out.println("持久化 Cookie 'userTheme' 已创建,有效期7天。");
}
public void deleteCookie(HttpServletResponse response, String cookieName) {
// 1. 创建一个同名、同路径的 Cookie
Cookie cookieToDelete = new Cookie(cookieName, "");
// 2. 设置路径,必须与要删除的 Cookie 路径完全一致
cookieToDelete.setPath("/");
// 3. 设置有效期为 0,这会指示浏览器删除该 Cookie
cookieToDelete.setMaxAge(0);
// 4. 将 Cookie 添加到响应中
response.addCookie(cookieToDelete);
System.out.println("Cookie '" + cookieName + "' 已被删除。");
}
}
重要注意事项
Cookie 的路径
setPath() 是一个非常重要但容易被忽略的方法,它定义了哪些 URL 请求会携带这个 Cookie。
- 场景:假设你在
/app/cart路径下设置了一个cartIdCookie,但没有设置setPath(),当你访问/app/profile时,浏览器不会发送这个cartIdCookie。 - 最佳实践:如果你希望一个 Cookie 在整个网站下都有效,通常应该将其路径设置为根路径 。
// 错误的做法:只在特定路径下有效
Cookie cookie1 = new Cookie("data", "value");
// cookie1.setPath("/app/profile"); // 只有访问 /app/profile 时才发送
// 正确的做法:在整个网站下有效
Cookie cookie2 = new Cookie("site-wide-data", "value");
cookie2.setPath("/"); // 访问任何路径都会发送
安全性
- HttpOnly:防止客户端脚本(如 JavaScript)访问 Cookie,可以有效防范 XSS(跨站脚本攻击)攻击,设置方式:
cookie.setHttpOnly(true); - Secure:仅当使用 HTTPS(安全连接)时才发送 Cookie 到服务器,设置方式:
cookie.setSecure(true);(注意:在本地开发时,HTTP 协议下设置 Secure 会导致 Cookie 无法发送)
字符编码
Cookie 的值和名称都不能包含空格、逗号等特殊字符,如果需要存储复杂信息,应该进行 URL 编码。
import java.net.URLEncoder;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
// 编码
String value = "some value with spaces";
String encodedValue = URLEncoder.encode(value, StandardCharsets.UTF_8.name());
Cookie cookie = new Cookie("name", encodedValue);
// 解码 (在读取 Cookie 时)
// String decodedValue = URLDecoder.decode(cookie.getValue(), StandardCharsets.UTF_8.name());
| 类型 | 设置方法 | 生命周期 | 存储位置 |
|---|---|---|---|
| 会话 Cookie | 不调用 setMaxAge() 或调用 setMaxAge(负数) |
浏览器关闭时删除 | 浏览器内存 |
| 持久化 Cookie | setMaxAge(正数) (单位:秒) |
在指定时间后自动删除,或手动设置为 0 删除 | 浏览器硬盘 |
核心步骤:
new Cookie(name, value)cookie.setPath("/")(推荐)cookie.setMaxAge(秒数)(如果想持久化)response.addCookie(cookie)
