- 服务端设置 Cookie:在 Servlet 或 JSP 中,通过
HttpServletResponse对象来创建和设置 Cookie。 - 客户端设置 Cookie:在 JavaScript 中,通过
document.cookie来设置,这种情况通常是服务端通过某种方式(如内联脚本)将 Cookie 的过期时间传递给客户端,由客户端执行。
下面我们分别详细介绍这两种情况。

服务端设置 Cookie (Java/Servlet)
在服务端,我们通过 javax.servlet.http.Cookie 类和 javax.servlet.http.HttpServletResponse 接口来操作 Cookie。
核心方法:setMaxAge(int expiry)
Cookie 类中的 setMaxAge(int seconds) 方法是设置 Cookie 有效期的关键。
- 参数
seconds:指定 Cookie 的存活时间,单位是秒。 - 作用:设置 Cookie 在客户端硬盘上的持久化时间。
setMaxAge 的三种常用值:
| 值 | 描述 | 行为 |
|---|---|---|
| 正数 | 指定具体的秒数 | Cookie 会被持久化到客户端的硬盘上,在指定的秒数后,Cookie 过期并被浏览器删除。setMaxAge(60 * 60 * 24 * 7) 表示 Cookie 一周后过期。 |
| 零 (0) | 立即删除 | 这是一种特殊的用法,用于删除一个已经存在的 Cookie,当浏览器收到一个 max-age=0 的 Cookie 时,它会立即检查并删除与该 Cookie 名称、路径和域匹配的 Cookie。 |
| 负数 | 会话 Cookie (默认值) | Cookie 不会被持久化到硬盘上,而是保存在浏览器的内存中,当用户关闭浏览器窗口或标签页时,Cookie 会被自动清除,这是 Cookie 类的默认行为。 |
完整代码示例 (Servlet)
这是一个完整的 Servlet 示例,展示了如何创建一个会话 Cookie 和一个持久化一周的 Cookie。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@WebServlet("/cookieExample")
public class CookieExampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// --- 1. 创建一个会话 Cookie (默认行为,max-age为负数) ---
// 这个 Cookie 在浏览器关闭后就会消失
Cookie sessionCookie = new Cookie("session-id", "12345-abcde-67890");
// 可以显式地设置 max-age 为负数,但这与默认行为相同
// sessionCookie.setMaxAge(-1);
response.addCookie(sessionCookie);
out.println("已创建一个会话 Cookie (session-id),关闭浏览器后它将消失。<br>");
// --- 2. 创建一个持久化 Cookie,有效期为一周 ---
// 为了支持中文等非ASCII字符,最好对 Cookie 值进行编码
String userName = "张三";
String encodedUserName = URLEncoder.encode(userName, StandardCharsets.UTF_8.name());
Cookie persistentCookie = new Cookie("user-name", encodedUserName);
persistentCookie.setMaxAge(60 * 60 * 24 * 7); // 7天,单位:秒
// 可以设置 Cookie 的路径,确保它在网站的特定区域有效
// persistentCookie.setPath("/"); // 有效路径为整个网站
response.addCookie(persistentCookie);
out.println("已创建一个持久化 Cookie (user-name),有效期为一周。<br>");
// --- 3. 演示如何删除一个 Cookie ---
// 要删除 Cookie,需要创建一个同名、同路径的 Cookie,并将其 max-age 设置为 0
Cookie cookieToDelete = new Cookie("session-id", ""); // 值可以设为空
cookieToDelete.setMaxAge(0); // 设置 max-age 为 0,表示立即删除
// cookieToDelete.setPath("/"); // 路径必须与要删除的 Cookie 完全匹配
response.addCookie(cookieToDelete);
out.println("已设置 session-id Cookie 的 max-age 为 0,它将在浏览器下次刷新时被删除。<br>");
}
}
重要注意事项:

- URL 编码:Cookie 的名称和值都不能包含空格、逗号、分号等特殊字符,如果存储中文或特殊符号,必须使用
URLEncoder.encode()进行编码,在读取时使用URLDecoder.decode()进行解码。 - 路径:
setPath(String path)用于指定 Cookie 在哪个路径下有效。setPath("/app")表示只有访问/app及其子路径(如/app/profile)时,浏览器才会发送这个 Cookie,如果不设置,默认值是创建该 Cookie 的页面路径。 - 域:
setDomain(String domain)用于指定 Cookie 的有效域。setDomain(".example.com")可以让 Cookie 在example.com及其所有子域名(如www.example.com,shop.example.com)下都有效,这通常用于跨子域共享登录状态。 - 安全性:
setSecure(boolean flag)设置为true时,Cookie 只能通过 HTTPS 连接发送,增强了安全性。setHttpOnly(boolean flag)设置为true时,JavaScript 将无法通过document.cookie访问该 Cookie,可以有效防止跨站脚本攻击。
客户端设置 Cookie (JavaScript)
在某些场景下,我们可能希望在前端控制 Cookie 的过期时间,在用户完成某个操作后设置一个长期有效的“已读”标记。
核心语法:document.cookie
document.cookie 是一个字符串,用于读取和写入 Cookie。
设置 Cookie 的语法:
document.cookie = "cookieName=cookieValue; expires=date; path=path; domain=domain; secure";
关键参数:expires
expires 参数用于指定 Cookie 的过期日期和时间,它的值必须是一个 GMT 格式的日期字符串。
示例:

// 1. 创建一个会话 Cookie (不设置 expires)
// 当浏览器关闭时,此 Cookie 会被删除
document.cookie = "session-token=xyz-123-abc";
// 2. 创建一个在 7 天后过期的 Cookie
function setCookieWithExpiry(name, value, days) {
const date = new Date();
// 将日期增加指定的天数
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
// 将日期转换为 GMT 格式的字符串
const expires = "expires=" + date.toUTCString();
// 组合 Cookie 字符串
document.cookie = name + "=" + value + ";" + expires + ";path=/";
}
// 调用函数,设置一个名为 "user-preference" 的 Cookie,7天后过期
setCookieWithExpiry("user-preference", "dark-mode", 7);
// 3. 删除一个 Cookie (将 expires 设置为一个过去的日期)
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
}
// 删除上面创建的 "session-token" Cookie
deleteCookie("session-token");
从服务端传递过期时间给客户端
一个常见的模式是,服务端计算好过期时间,然后将其作为变量传递给前端 JavaScript,由前端来执行设置。
服务端 (JSP 示例):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 计算出 7 天后的日期
java.util.Date expiryDate = new java.util.Date();
expiryDate.setTime(expiryDate.getTime() + 7L * 24 * 60 * 60 * 1000);
// 将日期转换为 JavaScript 可以识别的字符串格式
String jsExpiryDate = "new Date('" + expiryDate.toString() + "').toUTCString()";
%>
<html>
<head>客户端 Cookie 设置</title>
<script>
function setClientCookie() {
const name = "client-side-cookie";
const value = "this-was-set-by-js";
// 使用从 JSP 传递过来的过期时间
const expires = "<%= jsExpiryDate %>";
document.cookie = `${name}=${value}; expires=${expires}; path=/`;
alert("客户端 Cookie 已设置,有效期 7 天!");
}
</script>
</head>
<body>
<h1>客户端 Cookie 设置示例</h1>
<button onclick="setClientCookie()">设置一个 7 天后过期的 Cookie</button>
<p>打开浏览器的开发者工具 (F12) -> Application/存储 -> Cookie,可以查看设置的 Cookie。</p>
</body>
</html>
总结与对比
| 特性 | 服务端 (Java Servlet) | 客户端 (JavaScript) |
|---|---|---|
| 设置方法 | Cookie.setMaxAge(int seconds) |
document.cookie = "...; expires=date; ..." |
| 时间单位 | 秒 (整数) | GMT 日期字符串 |
| 删除方法 | 创建同名 Cookie,setMaxAge(0) |
创建同名 Cookie,expires=过去的时间 |
| 会话 Cookie | setMaxAge(-1) (或默认不设置) |
不设置 expires 属性 |
| 主要用途 | 用户认证、会话管理、用户偏好设置等核心业务逻辑。 | 前端交互、A/B 测试标记、用户体验优化等非核心或临时性状态管理。 |
最佳实践建议:
- 核心业务数据(如登录状态):始终在服务端设置和管理 Cookie,因为服务端环境更安全,可以更好地控制逻辑。
- 前端交互或临时标记:可以考虑在客户端设置 Cookie,但要时刻注意安全风险,特别是
HttpOnly和Secure标志,如果客户端设置的 Cookie 包含敏感信息,应确保它被标记为HttpOnly(虽然这样 JS 就无法访问了),或者通过安全的方式(如加密)处理。
