如何方便的获取 cookie 中的值?
我们知道,通过 document.cookie
可以获取到当前网站所有可用的 cookie
。
console.log(document.cookie);
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'
当然,细心的小伙伴肯定知道:如果在Set-Cookie
时设置了HttpOnly
属性,那么document.cookie
是无法获取到这个cookie
的。
好了,现在已经获取到了 cookie
,但是他是一个字符串,那如何获取到对应 key
的值呢?
一般情况下,咱们肯定是在 npm 中找一个成熟的第三方库来实现此功能,比如:js-cookie。
但是如果咱们只是想要某个 key
的值,并不需要添加或删除 cookie
呢?
在这种场景下,咱们就可以自己手动实现此功能,来减少第三方依赖和打包后的体积。
实现思路
字符串分割
按照 MDN 上面的定义,通过 document.cookie
获取到是通过 ;
(分号和空格)连接的 key=value
字符串。
所以,咱们直接通过字符串的 split
方法分割 2 次,即可格式化好所有的 cookie
。
// console.log(document.cookie);
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'
const cookieMap = new Map();
document.cookie.split("; ").forEach((cookie) => {
const [key, value] = cookie.split("=");
cookieMap.set(key, value);
})
console.log(cookieMap.size);
// 3
console.log(cookieMap.get("username"));
// FEHub
正则匹配
字符串的 match
方法可以传入一个正则表达式用来匹配内容。
如果我们要获取 username
的值,那么可以这样写:
// console.log(document.cookie);
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'
// 匹配一个存在的值
const result = document.cookie.match(/username=(\w+)/);
// ['username=FEHub', 'FEHub', index: 29, input: 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236', groups: undefined]
console.log(result[1]);
// FEHub
// 匹配一个不存在的值
const result2 = document.cookie.match(/xxx=(\w+)/);
// null
针对上面的正则,做一个简单的解释:
\w
:表示匹配字母、数字、下划线。+
:表示至少匹配一次前面的子表达式。()
:表示将匹配到的内容放入分组内。
如果匹配到内容,那么直接通过下标 1
即可获取对应的值。
如果获取不到内容, 那么返回值就是 null
。
然后咱们稍微封装一下,让他变得更通用一些:
const getCookie = (key) => {
const { cookie } = document;
return cookie.match(new RegExp(`${key}=(?<key>\\w+)`))?.groups?.key;
};
// console.log(document.cookie);
// 'token=eyJ0eXAiOiJKV1QiJ9ftU; username=FEHub; userOutId=362236'
console.log(getCookie('username'));
// FEHub
这里再简单提一嘴:
- 通过
new RegExp
动态生成正则,这样可以动态指定获取的key
。 - 由于生成正则时传入的是字符串表达式,所以需要将
\w
转义为\\w
。 (?<Name>x)
是正则的具名捕获组语法,目的是为了可以更明确的取值。
关注我
好了,这就是今天分享的全部内容啦 ~
关注我,每天学一个有趣的小知识 😉
FEHub
一起学前端 :)
推荐阅读
如何获取 <script> 标签上自定义参数的值?
前段时间开发了一个小插件,功能很简单,引入之后脚本会自动执行一些逻辑,所以在发布时将它打包成了 IIFE 模式的 js 包。在项目中接入时,直接通过 script 标签引入即可,就像这样: {代码...} 但是在插件的后续...
asong赞 1阅读 1.1k
JavaScript有用的代码片段和trick
平时工作过程中可以用到的实用代码集棉。判断对象否为空 {代码...} 浮点数取整 {代码...} 注意:前三种方法只适用于32个位整数,对于负数的处理上和Math.floor是不同的。 {代码...} 生成6位数字验证码 {代码...} ...
jenemy赞 49阅读 7.3k评论 12
再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...
libinfs赞 42阅读 7k评论 12
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...
wuwhs赞 32阅读 3.5k评论 5
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...
边城赞 29阅读 6.4k评论 5
2022大前端总结和2023就业分析
我在年前给掘金平台分享了《2022年热点技术盘点》的前端热点,算是系统性的梳理了一下我自己对前端一整年的总结。年后,在知乎上看到《前端的就业行情怎么样?》,下面都是各种唱衰前端的论调,什么裁员,外包化...
i5ting赞 27阅读 2.3k评论 4
深入理解React Diff算法
fiber上的updateQueue经过React的一番计算之后,这个fiber已经有了新的状态,也就是state,对于类组件来说,state是在render函数里被使用的,既然已经得到了新的state,那么当务之急是执行一次render,得到持有新...
nero赞 31阅读 11.8k评论 3
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。