以前在开发时想要获取和修改cookie
一直都是使用document.cookie
来进行操作的,而且cookie的属性又很多,赋值起来十分不方便,并且获取的时候不能根据属性名进行精确获取单独的一条cookie
,真的很难搞诶。那有没有什么比较现代化的API来帮助我们更好的处理cookie
呢。
需弃用的document.cookie
我们先来看看document.cookie
处理方式
假设我想要获取当前文档某一个cookie,那我也必须使用document.cookie
来获取所有非httpOnly, secure
的cookie,然后在进行提取。
有时候我们写模板就需要通过结果去获取数据,但是接口有需要使用cookies中的某个cookie,所以就需要进行额外提取。比如我要获取alimail的_csrf_token_
cookie,就需要下面这样提取。
js
document.cookie
.split("; ") // 以分号和空格分隔
.find((item) => item.includes("_csrf_token_="))
?.replace("_csrf_token_=", "");

目前在开发中前端写入cookie没有遇见,但是也很麻烦,特别是在定义cookie的不同属性,而且不支持一次性写入多cookie。

并且设置的时候还有些特殊的限制需要注意。
- 路径限制
- 设置
Path=/app
时,该 Cookie 仅在路径/app
及其子路径(如/app/sub
) 下生效。 - 若当前页面路径不在
/app
或其子路径下,浏览器会忽略此 Cookie。
- 设置

-
域名不匹配
- 默认情况下,Cookie 的
Domain
属性为当前页面的域名。 - 若尝试设置跨域 Cookie(如从
www.example.com
设置Domain=example.com
),需确保当前域名是子域名且符合浏览器安全策略。
- 默认情况下,Cookie 的
-
未编码特殊字符
- 由于
;
、,
、空格等符号在cookie中有特殊用处,键值不包含它们,如果包含需使用encodeURIComponent()
编码。
- 由于
各位兄弟你们在日常开发中如何使用的cookie啊。
赶快来使用CookieStore
CookieStore
是浏览器提供的一个新的 API,旨在更现代化、更便捷地管理 Cookie。
- 异步操作 :基于 Promise,避免传统
document.cookie
同步操作可能导致的性能问题。 - 类型安全:直接操作 Cookie 对象(键值对),而非手动解析字符串。
- Service Worker 支持:可在 Service Worker 中读写 Cookie,实现离线场景下的 Cookie 管理。
- 细粒度控制:支持设置 Cookie 的路径、域名、过期时间、安全属性等。
- 事件监听:可监听 Cookie 的变化(新增、修改、删除)。
写入set
自动化的检测,我们再也不用被耍了,通过document.cookie
明明设置了对应的cookie,为啥获取不到呢。让我们自己掌控我们的定义,设置的有问题直接抛错。
js
const zh = await cookieStore.set({
name: 'zh',
value: 'llm',
expires: Date.now() + 24 * 60 * 60 * 1000, // 1天后过期
domain: 'juejin.cn',
path: '/',
secure: true,
sameSite: 'lax'
});

获取get, getAll
- get 通过cookieName获取某个指定cookie。 对于同名的cookie,应该会获取最后一次添加的。
js
const zh = await cookieStore.get("zh")
- getAll 获取所有非
httpOnly, secure
的cookie。
js
const allCookies = await cookieStore.getAll();

删除delete
对于同名cookie,也是删除最后一次添加的。
js
const delZh = await cookieStore.delete('zh');
change事件
因为
CookieStore
继承了EventTarget
所以它理所应当的可以监听事件,刚好html5提供了一个change
事件可以监听cookie的变化。
event.changed
可以拿到所有添加的cookie。event.deleted
可以拿到所有删除的cookie。
js
cookieStore.addEventListener('change', event => {
event.changed.forEach(cookie => {
console.log(`Cookie 被修改: ${cookie.name} = ${cookie.value}`);
});
event.deleted.forEach(cookie => {
console.log(`Cookie 被删除: ${cookie.name}`);
});
});

Service worker中使用
该API还可以在Service worker
中使用,做一些和cookie相关的请求设置,例如用户偏好设置等等。感兴趣的可以研究研究,不了解Service Worker
的使用可以看这个简单的demo
兼容性
兼容性还是不太好,但是看你们的需求了,这里只提供下大致用法。
往期年度总结
- 在上海的忙碌一年,依旧充满憧憬(2024)
- 四年沿海城市,刚毕业,一年3家公司
- 七月仿佛又回到了那一年(2023年中总结)
- 一位初入职场前端仔的年度终结 <回顾2022,展望2023>
- 大学两年半的前端学习
往期文章
- 前端可以知道的录制浏览器标签页,没有黑魔法
- 一个关联本地页面镜像的功能,我了解到这些
- 啊,原来sessionStorage是这样的
- 如何像掘金编辑器一样粘贴图片即可上传服务器
- Nest装饰器全解析
- Nest世界中的AOP
- Nestjs如何解析http传输的数据
- 如何理解js的DOM事件系统
- 半年没看vue官网,3.5刚刚发布,趁机整理下
- 啊,你还在找一款强大的表格组件吗?
- 前端大量数据层级展示及搜索定位预览
- 如何从0开始认识m3u8(提取,解析及下载)
- 展示大量数据节点(tree),引发的一次性能排查
- ts装饰器的那点东西
- 这是你所知道的ts类型断言和类型守卫吗?
- TypeScript官网内容解读
- 经常使用ts的你,知道这些内容?
- 你有了解过原生css的scope?
- 现在比较常用的移动端调试你知道哪些?
- 众多跨标签页通信方式,你知道哪些?(二)
- 众多跨标签页通信方式,你知道哪些?
- 反调试吗?如何监听devtools的打开与关闭
- 因为原生,选择一家公司(前端如何防笔试作弊)
- 结合开发,带你熟悉package.json与tsconfig.json配置
- 如何优雅的在项目中使用echarts
- 如何优雅的做项目国际化
- 近三个月的排错,原来的憧憬消失喽
- 带你从0开始了解vue3核心(运行时)
- 带你从0开始了解vue3核心(computed, watch)
- 带你从0开始了解vue3核心(响应式)
- 3w+字的后台管理通用功能解决方案送给你
- 入职之前,狂补技术,4w字的前端技术解决方案送给你(vue3 + vite )
专栏文章
🔥如果此文对你有帮助的话,欢迎💗关注 、👍点赞 、⭐收藏 、✍️评论, 支持一下博主~
公众号:全栈追逐者,不定期的更新内容,关注不错过哦!
作者:Spirited_Away
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。