JS | 怎么通过JS脚本读取cookie?

目录

一. 读取单个cookie

原生JavaScript改进方案

第三方库方案

现代浏览器API

综合建议

二. 读取所有cookie(可选)


在JavaScript中,你可以使用`document.cookie`属性来读取、设置和删除cookie。下面是一些基本的方法来读取cookie:

一. 读取单个cookie

要读取一个名为cookieName的cookie,你可以这样做:

function getCookie(cookieName) {
    let name = cookieName + "=";
    let decodedCookie = decodeURIComponent(document.cookie);
    let ca = decodedCookie.split(';');
    for(let i = 0; i < ca.length; i++) {
        let c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

// 使用示例
let user = getCookie('username');
console.log(user);

函数功能解析

该函数用于从浏览器cookie中获取指定名称的值,属于前端开发中常见的cookie操作工具函数。

核心逻辑拆解

1、参数处理

  • 接收cookieName参数,拼接成name=value格式的查询字符串

2、cookie解码

  • decodeURIComponentdocument.cookie进行URL解码,处理特殊字符

3、数据分割

  • 用分号;分割解码后的字符串为数组ca,每个元素代表一个cookie键值对

4、遍历匹配

  • 循环检查每个元素是否以目标字符串开头
  • 去除前导空格后执行精确匹配

5、返回值

  • 匹配成功则返回等号后的值
  • 未找到时返回空字符串

使用注意事项

  • 需要调用前确保document.cookie已存在

  • 不支持路径(path)或域名(domain)限定

  • 如需设置cookie,需配合document.cookie使用

改进建议

  1. 增加对SameSite属性的支持

  2. 添加过期时间参数处理

  3. 考虑使用split('=')替代字符串查找提升性能

番外:以下是几种更简洁的cookie解析方法,结合不同技术方案实现:

原生JavaScript改进方案

1‌、正则表达式优化

使用正则匹配可减少循环和字符串操作:

function getCookie(name) {
    return document.cookie.match(`(^|;)\\s*${name}\\s*=\\s*([^;]+)`)?.pop() || "";
}

通过正则直接提取目标cookie值,避免手动分割字符串。

2、‌Object.fromEntries转换

将cookie转为对象后直接访问:

const cookies = Object.fromEntries(
    document.cookie.split(';').map(c => c.trim().split('='))
);
console.log(cookies.username); // 直接通过属性访问

此方法一次性解析所有cookie为键值对象。

第三方库方案

1‌、js-cookie库

轻量级库提供链式调用:

// 设置
Cookies.set('user', 'John', { expires: 7, path: '/' });
// 获取
console.log(Cookies.get('user')); // "John"

支持过期时间、路径等属性配置,代码量减少50%以上。

2、‌jQuery插件JQcookie

与jQuery深度集成:

$.cookie('theme', 'dark'); // 设置
$.cookie('theme'); // 获取
$.removeCookie('theme'); // 删除

支持JSON对象存储和跨域处理

现代浏览器API

1‌、Cookie Store API

异步操作更安全:

const cookie = await cookieStore.get('session');
console.log(cookie?.value);

需HTTPS环境,但避免了同步阻塞问题。

综合建议

  • 简单场景优先使用正则表达式方案(方法1)
  • 复杂项目推荐js-cookie库(方法3)
  • 未来兼容性考虑可逐步迁移至Cookie Store API(方法5)

二. 读取所有cookie(可选)

如果你想要读取所有cookie,可以直接使用document.cookie属性,然后对其进行解码和分割处理:

function getAllCookies() {
    let cookies = document.cookie;
    let cookiesArray = cookies.split(';');
    let cookiesObject = {};
    cookiesArray.forEach(function(cookie) {
        let [name, value] = cookie.trim().split('=');
        cookiesObject[name] = decodeURIComponent(value);
    });
    return cookiesObject;
}

// 使用示例
let allCookies = getAllCookies();
console.log(allCookies);

函数功能解析

这是一个JavaScript函数,用于获取当前页面的所有cookie并将其转换为对象格式。以下是代码的功能说明:

1、功能概述:

  • 读取document.cookie获取当前页面的所有cookie字符串
  • 将cookie字符串分割成数组
  • 将每个cookie转换为键值对形式并存入对象

2、实现特点:

  • 使用split(';')处理cookie分隔符
  • 使用trim()清除前后空格
  • 使用decodeURIComponent()解码cookie值
  • 返回包含所有cookie的键值对对象

3、使用场景:

  • 需要批量获取页面cookie时
  • 需要将cookie转换为更易操作的JavaScript对象时
  • 调试或检查当前页面cookie内容

4、注意事项:

  • 该函数只能在浏览器环境运行
  • 某些安全标记的cookie(如HttpOnly)无法通过JavaScript获取
  • 返回的对象只包含可访问的cook

注意事项:

❶ ‌安全性‌:直接在客户端读取cookie可能会暴露敏感信息,特别是如果这些cookie包含敏感数据(如认证令牌)。确保只在需要的时候读取,并考虑服务器端验证。

‌❷ 编码‌:document.cookie返回的cookie值是经过URL编码的,因此在解析和存储时需要使用decodeURIComponent()进行解码。

❸ ‌过期时间‌:虽然直接读取document.cookie不涉及过期时间的处理,但在设置cookie时,你应该考虑到过期时间(例如,使用expiresmax-age属性)以确保cookie在适当的时间后被删除。例如,在设置cookie时可以这样做:

document.cookie = "username=John Doe; max-age=3600; path=/"; // cookie将在1小时内有效

通过以上方法,你可以在JavaScript中灵活地读取和处理cookie。

以下是更简洁的 getAllCookies 实现方案:

const getAllCookies = () => 
  Object.fromEntries(
    document.cookie.split(';')
      .map(c => c.trim().split('='))
      .map(([k, v]) => [k, decodeURIComponent(v)])
  );

这个实现特点:

  1. 使用函数式编程风格,通过链式调用完成操作
  2. 利用Object.fromEntries直接构建对象
  3. 通过数组解构简化键值对处理
  4. 保持原有解码功能的同时减少中间变量
  5. 单箭头函数实现更紧凑的代码结构

相比原方案减少了3行代码,同时保持了相同的功能和健壮性。


▼番外:请说一下你用过的浏览器存储,并说出它们的区别?

浏览器存储主要分为Cookie、localStorage和sessionStorage三种方式,区别如下:

Cookie

1‌、功能定位‌:主要用于记录用户会话状态(如登录状态、购物车数据)和个性化设置,通过HTTP请求自动发送到服务器。

2‌、存储特性‌:

  • 每个域名最多20个Cookie,单个大小限制约4KB;

  • 支持跨站请求(可通过SameSite属性限制);注:Cookie 的 SameSite 属性

  • 支持加密存储,但可通过脚本读取。 ‌

数据默认会话结束时过期,但可以设置过期时间,在请求服务端,浏览器会默认把cookie数据发送给服务器,cookie能存放的数据相对较小。

localStorage

1、功能定位:适用于长期存储用户偏好设置(如主题、语言选择)、应用缓存数据等,数据仅在本地保存。 

2、存储特性‌:

  • 单个域名下最大存储容量约5MB;

  • 数据不会随页面刷新或关闭丢失,需手动清除;

  • 支持异步读写,适合复杂数据结构。 ‌

sessionStorage

1、功能定位‌:临时存储页面会话数据,页面关闭后自动清除。 ‌

‌2、存储特性‌:

  • 数据仅在当前浏览器标签页有效;

  • 容量与localStorage相同,但生命周期更短。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

儒雅的烤地瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值