Cookie Store API

Cookie Store API 提供了异步地管理 Cookie 的方式,同时允许在 ServiceWorker 中使用

在该 API 之前,使用 cookie 的方式是通过读写 document.cookie 属性,但其是单线程同步的,可能会阻碍事件循环;并且其无法在 ServiceWorker 中使用

Window 环境中通过 Window 接口的 cookieStore 属性使用

Window 环境中通过 ServiceWorkerGlobalScope 接口的 cookieStore 属性使用

1
2
window.cookieStore
self.cookieStore

CookieStore 接口的 get() 方法用于获取单条 Cookie

方法接收一个字符串,代表 Cookie 的名称;或接收一个对象,其 name 参数与 url 参数均需指定

方法返回一个 Promise 的 CookieListItem 结构,代表匹配到的 Cookie 信息;反之返回 undefined

1
2
3
4
5
const cookie = await window.cookieStore.get('cookie')
const cookie = await window.cookieStore.get({
name: 'cookie',
url: 'https://www.example.com',
})

CookieStore 接口的 getAll() 方法用于获取单条 Cookie

方法接收一个字符串,代表 Cookie 的名称;或接收一个对象,其 name 参数与 url 参数均需指定

方法返回一个 Promise 的 CookieList 结构,代表匹配到的所有 Cookie

1
2
3
4
5
const cookies = await window.cookieStore.getAll('key')
const cookies = await window.cookieStore.getAll({
name: 'key',
url: 'https://www.example.com',
})

CookieStore 接口的 set() 方法用于设置 Cookie

方法可以接收两个字符串,分别代表 Cookie 的名称与值;亦可以接收一个配置项,各项如下所示:

  • name 属性必需
  • value 属性必需
  • expires 属性可选,默认 null
  • domain 属性可选,默认 null
  • path 属性可选,默认 "/"
  • sameSite 属性可选,默认 "strict"
  • partitioned 属性可选,默认 false

方法返回一个 Promise

1
2
3
4
5
6
7
8
9
10
await window.cookieStore.set('key', 'value')
await window.cookieStore.set({
name: 'key',
value: 'value',
expires: null,
domain: null,
path: '/',
sameSite: 'strict',
partitioned: false,
})

CookieStore 接口的 delete() 方法用于移除 Cookie

方法接收一个字符串,代表 Cookie 的名称;或接收一个对象,其 name 参数必需指定;path 参数 domain 参数 partitioned 参数可选

方法返回一个 Promise

1
2
3
4
5
6
7
await window.cookieStore.delete('key')
await window.cookieStore.delete({
name: 'key',
path: '/',
domain: null,
partitioned: false,
})

CookieList 结构相当于 CookieListItem 结构的数组

CookieListItem 结构反映了 Cookie 的详细信息

CookieListItem 结构的 name 属性返回一个字符串,代表 Cookie 的名称

CookieListItem 结构的 value 属性返回一个字符串,代表 Cookie 的值

CookieListItem 结构的 domain 属性返回一个字符串,代表 Cookie 的域,该属性可能返回 null

CookieListItem 结构的 path 属性返回一个字符串,代表 Cookie 的路径

CookieListItem 结构的 expires 属性返回一个数字,代表 Cookie 的过期时间,该属性可能返回 null

CookieListItem 结构的 secure 属性返回一个布尔值,代表 Cookie 的严格上下文策略

CookieListItem 结构的 sameSite 属性返回一个字符串,代表 Cookie 的同域策略,为 "strict" "lax" "none" 之一

CookieListItem 结构的 partitioned 属性返回一个布尔值,代表 Cookie 的分区策略

CookieStore 接口的 change 事件在任一 Cookie 变化时触发,返回一个 CookieChangeEvent 事件

CookieChangeEvent 接口的 changed 属性返回一个 CookieListItem 结构只读数组,表示被修改的 Cookie

CookieChangeEvent 接口的 deleted 属性返回一个 CookieListItem 结构只读数组,表示被移除的 Cookie

1
2
3
4
window.cookieStore.addEventListener('change', (e) => {
e.changed
e.deleted
})

但该事件仅在 Window 环境中可用

ServiceWorker 中允许通过 CookieStoreManager 接口的方法动态控制 Cookie 变化的订阅

可通过 ServiceWorkerRegistration 接口的 cookies 属性获取到 CookieStoreManager 实例

1
self.registration.cookies

获取订阅

CookieStoreManager 接口的 getSubscriptions() 方法用于获取当前所有的订阅

方法返回一个对象数组,数组各项包含 name 参数和 url 参数

1
const subscriptions = await self.registration.cookies.getSubscriptions()

添加订阅

CookieStoreManager 接口的 subscribe() 方法用于添加订阅

方法传入一个对象数组参数,各项的 name 参数与 url 参数均需指定

方法返回一个 Promise

1
2
3
4
5
6
self.registration.cookies.subscribe([
{
name: 'key',
url: '/',
},
])

移除订阅

CookieStoreManager 接口的 unsubscribe() 方法用于移除订阅

方法传入一个对象数组参数,各项的 name 参数与 url 参数均需指定

方法返回一个 Promise

1
2
3
4
5
6
self.registration.cookies.unsubscribe([
{
name: 'key',
url: '/',
},
])

ServiceWorkerGlobalScope 接口的 cookiechange 事件在订阅的 Cookie 发生变化时触发,返回一个 ExtendableCookieChangeEvent 事件

ExtendableCookieChangeEvent 接口的 changed 属性返回一个 CookieListItem 结构只读数组,表示被修改的 Cookie

ExtendableCookieChangeEvent 接口的 deleted 属性返回一个 CookieListItem 结构只读数组,表示被移除的 Cookie

1
2
3
4
self.addEventListener('cookiechange', (e) => {
e.changed
e.deleted
})

示例

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
interface CookieStore extends EventTarget {
get(name: string): Promise<CookieListItem | undefined>
get(options?: CookieStoreGetOptions): Promise<CookieListItem | undefined>

getAll(name: string): Promise<CookieList>
getAll(options?: CookieStoreGetOptions): Promise<CookieList>

set(name: string, value: string): Promise<undefined>
set(options: CookieInit): Promise<undefined>

delete(name: string): Promise<undefined>
delete(options: CookieStoreDeleteOptions): Promise<undefined>

onchange: ((this: CookieStore, ev: CookieChangeEvent) => any) | null
}

interface CookieStoreGetOptions {
name: string
url: string
}

enum CookieSameSite {
"strict",
"lax",
"none"
}

interface CookieInit {
name: string
value: string
expires?: DOMHighResTimeStamp | null
domain?: string | null
path?: string
sameSite?: CookieSameSite
partitioned?: boolean
}

interface CookieStoreDeleteOptions {
name: string
domain?: string | null
path?: string
partitione?: boolean
}

interface CookieListItem {
name: string
value: string
domain?: string
path: string
expires?: DOMHighResTimeStamp
secure: boolean
sameSite: CookieSameSite
partitioned: boolean
}

type CookieList = Array<CookieListItem>

interface CookieStoreManager {
subscribe(subscriptions: Array<CookieStoreGetOptions>): Promise<undefined>
getSubscriptions(): Promise<Array<CookieStoreGetOptions>>
unsubscribe(subscriptions: Array<CookieStoreGetOptions>): Promise<undefined>
}

interface ServiceWorkerRegistration {
readonly cookies: CookieStoreManager
}

interface CookieChangeEvent extends Event {
constructor(type: string, eventInitDict?: CookieChangeEventInit)
readonly changed: ReadonlyArray<CookieListItem>
readonly deleted: ReadonlyArray<CookieListItem>
}

interface CookieChangeEventInit extends EventInit {
changed: CookieList
deleted: CookieList
}

interface ExtendableCookieChangeEvent extends ExtendableEvent {
constructor(type: string, eventInitDict?: ExtendableCookieChangeEventInit)
readonly changed: ReadonlyArray<CookieListItem>
readonly deleted: ReadonlyArray<CookieListItem>
}

interface ExtendableCookieChangeEventInit extends ExtendableEventInit {
changed: CookieList
deleted: CookieList
}

interface Window {
readonly cookieStore: CookieStore
}

interface ServiceWorkerGlobalScope {
readonly cookieStore: CookieStore

oncookiechange: ((this: ServiceWorkerGlobalScope, ev: ExtendableCookieChangeEvent) => any) | null
}

链接

发布于

2023-11-09

更新于

2025-01-05

许可协议

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...