CookieStore

基线 2025 *
新推出

自 2025 年 6 月起,此功能已在最新的设备和浏览器版本中可用。此功能可能不适用于旧设备或浏览器。

* 此特性的某些部分可能存在不同级别的支持。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Service Workers 中可用。

CookieStore 接口是 Cookie Store API 的一部分,它提供了从页面或 Service Worker 异步获取和设置 cookie 的方法。

CookieStore 可在 WindowServiceWorkerGlobalScope 上下文中通过全局作用域的属性访问。因此,它没有构造函数。

EventTarget CookieStore

实例方法

CookieStore.delete()

delete() 方法会删除具有给定 nameoptions 对象的 cookie。它返回一个 Promise,该 Promise 在删除完成或没有匹配的 cookie 时解析。

CookieStore.get()

get() 方法会获取具有给定 nameoptions 对象的单个 cookie。它返回一个 Promise,该 Promise 会解析为单个 cookie 的详细信息。

CookieStore.getAll()

getAll() 方法会获取所有匹配的 cookie。它返回一个 Promise,该 Promise 会解析为 cookie 列表。

CookieStore.set()

set() 方法使用给定的 namevalueoptions 对象来设置 cookie。它返回一个 Promise,该 Promise 在 cookie 设置完成后解析。

事件

change

当任何 cookie 被更改时,会触发 change 事件。

示例

下面的示例可以通过将代码复制到测试环境中并使用 本地服务器 运行,或将其部署到 GitHub Pages 等网站上进行测试。

设置 cookie

本示例展示了如何通过传递 namevalue 来设置 cookie,以及通过设置 options 值来设置 cookie。

cookieTest() 方法使用 namevalue 属性设置一个 cookie,并使用 namevalueexpires 属性设置另一个 cookie。然后,我们使用 CookieStore.get() 方法获取每个 cookie,并将它们记录下来。

js
async function cookieTest() {
  // Set cookie: passing name and value
  try {
    await cookieStore.set("cookie1", "cookie1-value");
  } catch (error) {
    console.log(`Error setting cookie1: ${error}`);
  }

  // Set cookie: passing options
  const day = 24 * 60 * 60 * 1000;

  try {
    await cookieStore.set({
      name: "cookie2",
      value: "cookie2-value",
      expires: Date.now() + day,
      partitioned: true,
    });
  } catch (error) {
    log(`Error setting cookie2: ${error}`);
  }

  // Get named cookies and log their properties
  const cookie1 = await cookieStore.get("cookie1");
  console.log(cookie1);

  const cookie2 = await cookieStore.get("cookie2");
  console.log(cookie2);
}

cookieTest();

获取 cookie

本示例展示了如何使用 CookieStore.get() 获取特定 cookie,或使用 CookieStore.getAll() 获取所有 cookie。

示例代码首先设置三个 cookie,用于演示获取方法。首先,它使用 CookieStore.set() 方法创建 cookie1cookie2。然后,它使用较旧的同步 Document.cookie 属性创建第三个 cookie(以便我们展示这些 cookie 也可以使用 get()getAll() 方法获取)。

然后,代码使用 CookieStore.get() 获取 "cookie1" 并记录其属性,然后使用 CookieStore.getAll()(不带参数)获取当前上下文中的所有 cookie。

js
async function cookieTest() {
  // Set a cookie passing name and value
  try {
    await cookieStore.set("cookie1", "cookie1-value");
  } catch (error) {
    console.log(`Error setting cookie1: ${error}`);
  }

  // Set a cookie passing an options object
  const day = 24 * 60 * 60 * 1000;
  try {
    await cookieStore.set({
      name: "cookie2",
      value: `cookie2-value`,
      expires: Date.now() + day,
      partitioned: true,
    });
  } catch (error) {
    console.log(`Error setting cookie2: ${error}`);
  }

  // Set cookie using document.cookie
  // (to demonstrate these are are fetched too)
  document.cookie = "favorite_food=tripe; SameSite=None; Secure";

  // Get named cookie and log properties
  const cookie1 = await cookieStore.get("cookie1");
  console.log(cookie1);

  // Get all cookies and log each
  const cookies = await cookieStore.getAll();
  if (cookies.length > 0) {
    console.log(`getAll(): ${cookies.length}:`);
    cookies.forEach((cookie) => console.log(cookie));
  } else {
    console.log("Cookies not found");
  }
}

cookieTest();

示例应分别记录 "cookie1" 和所有三个 cookie。需要注意的是,使用 Document.cookie 创建的 cookie 的路径可能与使用 set()(默认值为 /)创建的 cookie 不同。

本示例展示了如何使用 delete() 方法删除命名 cookie。

代码首先设置两个 cookie 并将它们记录到控制台。然后,我们删除其中一个 cookie,然后再次列出所有 cookie。已删除的 cookie ("cookie1") 出现在第一个日志数组中,而未出现在第二个数组中。

js
async function cookieTest() {
  // Set two cookies
  try {
    await cookieStore.set("cookie1", "cookie1-value");
  } catch (error) {
    console.log(`Error setting cookie1: ${error}`);
  }

  try {
    await cookieStore.set("cookie2", "cookie2-value");
  } catch (error) {
    console.log(`Error setting cookie2: ${error}`);
  }

  // Log cookie names
  let cookieNames = (await cookieStore.getAll())
    .map((cookie) => cookie.name)
    .join(" ");
  console.log(`Initial cookies: ${cookieNames}`);

  // Delete cookie1
  await cookieStore.delete("cookie1");

  // Log cookies again (to show cookie1 deleted)
  cookieNames = (await cookieStore.getAll())
    .map((cookie) => cookie.name)
    .join(" ");
  console.log(
    `Cookies remaining after attempted deletions (cookie1 should be deleted): ${cookieNames}`,
  );
}

cookieTest();

规范

规范
Cookie Store API
# CookieStore

浏览器兼容性