杰瑞科技汇

Java Cookie时间如何正确设置与持久化?

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

下面我们分别详细介绍这两种情况。

Java Cookie时间如何正确设置与持久化?-图1
(图片来源网络,侵删)

服务端设置 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>");
    }
}

重要注意事项:

Java Cookie时间如何正确设置与持久化?-图2
(图片来源网络,侵删)
  1. URL 编码:Cookie 的名称和值都不能包含空格、逗号、分号等特殊字符,如果存储中文或特殊符号,必须使用 URLEncoder.encode() 进行编码,在读取时使用 URLDecoder.decode() 进行解码。
  2. 路径setPath(String path) 用于指定 Cookie 在哪个路径下有效。setPath("/app") 表示只有访问 /app 及其子路径(如 /app/profile)时,浏览器才会发送这个 Cookie,如果不设置,默认值是创建该 Cookie 的页面路径。
  3. setDomain(String domain) 用于指定 Cookie 的有效域。setDomain(".example.com") 可以让 Cookie 在 example.com 及其所有子域名(如 www.example.com, shop.example.com)下都有效,这通常用于跨子域共享登录状态。
  4. 安全性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 格式的日期字符串

示例:

Java Cookie时间如何正确设置与持久化?-图3
(图片来源网络,侵删)
// 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,但要时刻注意安全风险,特别是 HttpOnlySecure 标志,如果客户端设置的 Cookie 包含敏感信息,应确保它被标记为 HttpOnly(虽然这样 JS 就无法访问了),或者通过安全的方式(如加密)处理。
分享:
扫描分享到社交APP
上一篇
下一篇