还在用document.cookie操作cookie吗?试试这个

以前在开发时想要获取和修改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中有特殊用处,键值不包含它们,如果包含需使用 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

兼容性

兼容性还是不太好,但是看你们的需求了,这里只提供下大致用法。

往期年度总结

往期文章

专栏文章

🔥如果此文对你有帮助的话,欢迎💗关注 、👍点赞 、⭐收藏✍️评论, 支持一下博主~

公众号:全栈追逐者,不定期的更新内容,关注不错过哦!

作者:Spirited_Away

链接:juejin.cn/post/749046...

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
一丝晨光28 分钟前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
小堃学编程40 分钟前
前端学习(3)—— CSS实现热搜榜
前端·学习
Wannaer1 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js
不灭锦鲤1 小时前
xss-labs靶场基础8-10关(记录学习)
前端·学习·xss
Bl_a_ck1 小时前
--openssl-legacy-provider is not allowed in NODE_OPTIONS 报错的处理方式
开发语言·前端·web安全·网络安全·前端框架·ssl
懒羊羊我小弟1 小时前
手写符合Promise/A+规范的Promise类
前端·javascript
互联网搬砖老肖1 小时前
Web 架构之负载均衡会话保持
前端·架构·负载均衡
赵大仁1 小时前
React vs Vue:点击外部事件处理的对比与实现
javascript·vue.js·react.js
PgSheep2 小时前
深入理解 JVM:StackOverFlow、OOM 与 GC overhead limit exceeded 的本质剖析及 Stack 与 Heap 的差异
jvm·面试
肥肥呀呀呀2 小时前
在Flutter上如何实现按钮的拖拽效果
前端·javascript·flutter