杰瑞科技汇

Java Cookie有效期如何设置与计算?

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

Java Cookie有效期如何设置与计算?-图1
(图片来源网络,侵删)
  1. 会话 Cookie (Session Cookie):存活时间仅限于当前浏览器会话,当用户关闭浏览器窗口或标签页时,Cookie 会被自动删除。
  2. 持久化 Cookie (Persistent Cookie):可以存活更长时间,即使浏览器关闭,只要在有效期内,Cookie 仍然保存在用户的电脑上,下次访问网站时仍然有效。

下面我们详细说明如何设置这两种有效期。


会话 Cookie (默认行为)

这是 Cookie 的默认状态,当你创建一个 Cookie 对象并将其添加到响应中时,如果不进行任何特殊设置,它就是一个会话 Cookie。

特点:

  • 不会设置 ExpiresMax-Age 属性。
  • 生命周期与浏览器进程绑定,浏览器关闭,Cookie 丢失。
  • 保存在浏览器的内存中,不会写入硬盘。

示例代码: 这种情况下,你只需要创建 Cookie 并发送,无需设置有效期。

Java Cookie有效期如何设置与计算?-图2
(图片来源网络,侵删)
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,浏览器关闭时即被删除。

示例代码:

Java Cookie有效期如何设置与计算?-图3
(图片来源网络,侵删)

创建一个有效期为 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 路径下设置了一个 cartId Cookie,但没有设置 setPath(),当你访问 /app/profile 时,浏览器不会发送这个 cartId Cookie。
  • 最佳实践:如果你希望一个 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 删除 浏览器硬盘

核心步骤:

  1. new Cookie(name, value)
  2. cookie.setPath("/") (推荐)
  3. cookie.setMaxAge(秒数) (如果想持久化)
  4. response.addCookie(cookie)
分享:
扫描分享到社交APP
上一篇
下一篇