JavaScript Cookie 使用完整指南

JavaScript Cookie 使用完整指南

1. Cookie 基本概念与重要性

1.1 什么是 Cookie

Cookie 是存储在用户浏览器中的小型文本数据(通常不超过 4KB),用于在客户端保存少量信息。当用户访问网站时,浏览器会将 Cookie 自动发送到服务器,从而实现状态管理。

主要特点:

  • 存储大小限制约为 4KB
  • 会随每次 HTTP 请求发送到服务器(同域情况下)
  • 有生命周期控制,可设置过期时间
  • 支持路径和域名限制,保障安全性

1.2 Cookie 的重要性

Cookie 在现代 Web 开发中扮演着重要角色,主要用于:

  • 用户身份认证:存储登录状态和会话标识
  • 个性化设置:保存用户偏好(如主题、语言)
  • 行为追踪:记录用户交互数据用于分析
  • 购物车功能:在电子商务网站中保持用户购物车状态

2. Cookie 基本操作

操作类别方法描述代码示例/语法关键参数/说明
设置Cookie创建或更新 Cookiedocument.cookie = "name=value; [attributes]"基本格式:name=value 后接属性键值对,用分号分隔
设置过期时间控制Cookie生命周期expires=GMT_Stringmax-age=secondsexpires 接受 GMT 格式时间字符串;max-age 设置相对当前时间的秒数
设置路径控制Cookie可访问的路径path=/path默认为当前路径。设为 path=/ 使 Cookie 在全站有效
设置域名控制Cookie可访问的域名domain=example.com默认为当前域名。可设置父域实现子域共享
安全标志增强安全性SecureHttpOnlySecure 仅限 HTTPS 传输;HttpOnly 阻止 JavaScript 访问(提升安全性,但设置后JS无法操作)
SameSite属性控制跨站请求发送SameSite=Strict|Lax|None防范 CSRF 攻击。设为 None 时需同时设置 Secure
读取所有Cookie获取当前可访问的所有Cookieconst allCookies = document.cookie;返回格式为 "name1=value1; name2=value2" 的字符串,需手动解析
读取特定Cookie获取指定名称的Cookie值手动解析字符串或使用封装函数需要从 document.cookie 字符串中查找并提取
更新Cookie修改已存在的Cookie同设置方法,保持名称、路径、域名不变即可覆盖新值会覆盖旧值,其他属性需保持一致
删除Cookie使Cookie立即失效设置 expires 为过去时间或 max-age 为负值推荐:expires=Thu, 01 Jan 1970 00:00:00 GMT
使用js-cookie库简化Cookie操作引入库后使用简洁API设置:Cookies.set('name', 'value', {options})
读取:Cookies.get('name')
删除:Cookies.remove('name')

2.1 设置 Cookie

使用 document.cookie 属性设置 Cookie,可以包含名称、值、过期时间等参数 。

// 基本设置
document.cookie = "username=JohnDoe";
// 设置带过期时间的 Cookie
const expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 7); // 7天后过期
document.cookie = username=JohnDoe; expires=${expirationDate.toUTCString()}; path=/;

2.2 读取 Cookie

读取 document.cookie 会得到一个字符串,其中包含当前页面可访问的所有 Cookie。要获取特定值,需要手动解析。

function getCookie(name) {
const nameEQ = name + "=";
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) {
return decodeURIComponent(c.substring(nameEQ.length, c.length));
}
}
return null;
}
// 使用示例
const username = getCookie("username");
console.log(username); // 输出 "JohnDoe"

2.3 删除 Cookie

删除 Cookie 的本质是将该 Cookie 的过期时间设置为一个过去的日期。

// 删除名为 "username" 的 Cookie
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";

2.4 完整工具函数

以下是一套完整的 Cookie 操作工具函数 :

// 设置 Cookie
function setCookie(name, value, seconds, path = '/', domain, secure = false) {
    let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
    if (seconds) {
        cookieText += `; max-age=${seconds}`;
    }

    cookieText += `; path=${path}`;
    if (domain) cookieText += `; domain=${domain}`;
    if (secure) cookieText += '; secure';
    console.log(cookieText)
    document.cookie = cookieText;
}
// 获取 Cookie
function getCookie(name) {
    const nameEQ = encodeURIComponent(name) + "=";
    const cookieKV = document.cookie.split(';');
    for (let i = 0; i < cookieKV.length; i++) {
        let kv = cookieKV[i].trim();
        if (kv.indexOf(nameEQ) === 0) {
            return decodeURIComponent(kv.substring(nameEQ.length));
        }
    }
    return null;
}
// 删除 Cookie
function deleteCookie(name, path = '/', domain) {
    let cookieText = `${encodeURIComponent(name)}=; max-age=0; path=${path}`;
    if (domain) cookieText += `; domain=${domain}`;
    document.cookie = cookieText;
}

export {setCookie, getCookie, deleteCookie}

3. Cookie 属性详解

3.1 过期时间(Expires/Max-Age)

控制 Cookie 的生命周期:

  • Expires:指定具体的过期时间(GMT 格式)
  • Max-Age:指定从设置开始的有效秒数
// 使用 Expires
const expiresDate = new Date();
expiresDate.setFullYear(expiresDate.getFullYear() + 1);
document.cookie = username=JohnDoe; expires=${expiresDate.toUTCString()};
// 使用 Max-Age(优先级更高)
document.cookie = "username=JohnDoe; max-age=31536000"; // 1年有效

3.2 路径(Path)和域(Domain)

控制 Cookie 的可访问范围 :

// 设置路径和域
document.cookie = "username=JohnDoe; path=/admin; domain=.example.com";

3.3 安全标志

增强 Cookie 的安全性:

标志作用示例
Secure仅通过 HTTPS 传输document.cookie = "session=abc; secure"
HttpOnly防止 JavaScript 访问(需服务器设置)服务器端设置
SameSite控制跨站请求 Cookie 发送SameSite=Strict|Lax|None
javascript
// 安全 Cookie 设置示例
document.cookie = “sessionId=abc123; secure; SameSite=Strict”;

4. 使用 js-cookie 库

4.1 安装和引入

通过 npm 安装
npm install js-cookie

// 引入库
import Cookies from 'js-cookie';

4.2 基本使用

// 设置 Cookie
Cookies.set('username', 'JohnDoe', { expires: 7, path: '/', secure: true });
// 获取 Cookie
const username = Cookies.get('username');
// 删除 Cookie
Cookies.remove('username', { path: '/' });
// 设置 JSON 对象
Cookies.set('preferences', { theme: 'dark', language: 'zh-CN' }, { expires: 7 });
const prefs = Cookies.getJSON('preferences');

5. 实际应用场景

5.1 用户登录状态保持

// 登录成功后设置认证 Cookie
function setAuthCookie(userData) {
const expires = new Date();
expires.setDate(expires.getDate() + 30); // 30天有效期
document.cookie = `authToken=${userData.token}; expires=${expires.toUTCString()}; path=/; secure`;
document.cookie = `userInfo=${encodeURIComponent(JSON.stringify(userData))}; expires=${expires.toUTCString()}; path=/`;
}
// 检查登录状态
function checkAuth() {
const token = getCookie('authToken');
const userInfo = getCookie('userInfo');
if (token && userInfo) {
    return JSON.parse(decodeURIComponent(userInfo));
}
return null;
}

5.2 用户偏好设置

// 保存用户设置
function saveUserPreferences(settings) {
Cookies.set('userPrefs', settings, { expires: 365, path: '/' });
}
// 获取用户设置
function getUserPreferences() {
return Cookies.getJSON('userPrefs') || {
theme: 'light',
language: 'zh-CN',
notifications: true
};
}

5.3 购物车功能

// 添加商品到购物车
function addToCart(productId, quantity = 1) {
const cart = Cookies.getJSON('cart') || {};
cart[productId] = (cart[productId] || 0) + quantity;
Cookies.set('cart', cart, { expires: 7, path: '/' });
}
// 获取购物车内容
function getCart() {
return Cookies.getJSON('cart') || {};
}
// 清空购物车
function clearCart() {
Cookies.remove('cart', { path: '/' });
}

6. 安全最佳实践

6.1 安全设置

// 安全地设置认证 Cookie
document.cookie = [
authToken=${token},
'HttpOnly', // 防止 XSS 攻击
'Secure', // 仅 HTTPS 传输
'SameSite=Strict', // 防止 CSRF 攻击
'path=/',
domain=${window.location.hostname},
expires=${expiresDate.toUTCString()}
].join('; ');

6.2 敏感数据处理

// 对敏感数据进行加密
import CryptoJS from 'crypto-js';
function setEncryptedCookie(name, data, secretKey) {
const encrypted = CryptoJS.AES.encrypt(JSON.stringify(data), secretKey).toString();
Cookies.set(name, encrypted, { secure: true, sameSite: 'strict' });
}
function getEncryptedCookie(name, secretKey) {
const encrypted = Cookies.get(name);
if (!encrypted) return null;
const bytes = CryptoJS.AES.decrypt(encrypted, secretKey);
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
}

7. 常见问题与解决方案

7.1 Cookie 未正确设置

问题原因:

  • 路径或域名设置不正确
  • 浏览器安全策略阻止
  • 大小超过 4KB 限制

解决方案:

// 检查路径和域名
function debugCookie(name) {
console.log('All cookies:', document.cookie);
console.log('Cookie value:', getCookie(name));
}
// 确保使用正确的路径
document.cookie = test=value; path=/; domain=${window.location.hostname};

7.2 跨域问题

// 设置跨域 Cookie(需服务器配合)
document.cookie = "shared=value; domain=.example.com; path=/; SameSite=None; Secure";
// AJAX 请求携带 Cookie
fetch('/api/data', {
credentials: 'include', // 携带 Cookie
headers: {
'Content-Type': 'application/json'
}
});

7.3 浏览器兼容性

// 特性检测
function supportsCookies() {
try {
document.cookie = 'test=1';
return document.cookie.indexOf('test=') !== -1;
} catch (e) {
return false;
}
}
if (!supportsCookies()) {
// 降级方案:使用 localStorage 或 sessionStorage
console.warn('Cookies are disabled, using fallback storage');
}

8. 性能优化建议

8.1 减少 Cookie 数量和大小

  • 每个 Cookie 尽量小于 1KB
  • 单个域名下 Cookie 数量控制在 20 个以内
  • 避免在 Cookie 中存储大量数据

8.2 合理设置过期时间

// 根据使用场景设置不同的过期时间
const cookieConfigs = {
session: { expires: 0 }, // 会话期
shortTerm: { expires: 1 }, // 1天
longTerm: { expires: 30 }, // 30天
permanent: { expires: 365 } // 1年
};
Cookies.set('userPrefs', data, cookieConfigs.longTerm);

9. 与现代存储 API 的比较

存储方案容量生命周期自动发送适用场景
Cookie4KB可设置身份认证、会话管理
localStorage5MB永久用户偏好、缓存数据
sessionStorage5MB会话期页面级临时数据
IndexedDB大量永久复杂结构化数据

10. 总结

JavaScript Cookie 是 Web 开发中不可或缺的重要技术,正确使用 Cookie 可以显著提升用户体验和应用安全性。通过掌握本文介绍的各项技术和最佳实践,您将能够:

  1. 正确操作 Cookie:使用原生 API 或第三方库进行增删改查
  2. 合理配置属性:根据需求设置过期时间、路径、安全标志等
  3. 确保安全性:采用加密、HttpOnly、Secure 等安全措施
  4. 优化性能:控制 Cookie 大小和数量,合理设置生命周期
  5. 处理常见问题:解决跨域、兼容性、设置失败等问题

Cookie 技术虽然传统,但在用户认证、状态管理等方面仍然发挥着不可替代的作用。结合现代 Web 存储 API,可以构建出既安全又高效的前端数据存储方案 。
这份 Markdown 文档详细介绍了 JavaScript Cookie 的完整使用方法,涵盖了从基础概念到高级应用的所有方面。您可以直接将这份源码放入您的 Markdown 文档中使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

倚肆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值