视频加载失败

前端本地存储

1248 字
6 分钟
前端本地存储
  • 浏览器存储在本地的一小段字符串数据,用来保存用户状态。所以敏感信息不要放在Cookie
  • 一般会自动随着浏览器每次请求发送到服务器上(修改网站语言)

Cookie有什么用

  • Cookie跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等利用(Cookie + JS + 后端日志 + 大数据系统)

在浏览器操作Cookie

  • 谷歌浏览器-F12控制台-Application-Cookie-网站 输入KV值
  • document.cookie 能输出刚才的Cookie

写入Cookie

//写入
document.cookie = 'username = youzi';
document.cookie = 'age = 18';
// 不能一起写入
//document.cookie = 'username = youzi;age = 18';

读取Cookie

console.log(document.cookie);
  • Cookie 的属性(Attributes)决定了,这个 Cookie 能存多久、在哪些请求中发送、谁可以访问、是否安全等。

  • Cookie 的名称或值如果包含非英文字母,则写入时需要使用encodeURIComponent0编码,读取时使用decodeURIComponent(解码),一般名称使用英文字母,不要用中文,值可以用中文,但是要编码

  • 如果没有设置失效(到期)时间,这样的Cookie称为会话Cookie,它存在内存中,当会话结束,也就是浏览器关闭时,Cookie消失

    //属性可以一起写;expires指定 Cookie 的绝对过期时间
    document.cookie = `username = youzi;expires =${new Date('2026-6-27 13:41:00')}`;
  • Max-Age(存活时间):指定 Cookie 还能存活多少秒。

    document.cookie = 'age=18;max-age=5';
  • 如果max-age的值是0或负数,则Cookie会被删除

  • Domain(域名):哪些域名可以使用这个 Cookie。默认值就是当前网站

  • HttpOnly:JavaScript 无法访问这个 Cookie。防止XSS 攻击

  • SameSite:防止 CSRF 攻击。只有同站请求才发送 Cookie。

  • 只有name,value,Domain,path都一样的情况下才算一个Cookie ,才会覆盖

属性作用
Expires绝对过期时间
Max-Age存活秒数
Path生效路径(同一个域名下)
Domain生效域名(不同域名的情况)
Secure仅 HTTPS 发送
HttpOnlyJS 不可访问
SameSite防止 CSRF
Partitioned第三方 Cookie 分区

为什么封装?

  1. 语法难用

    实际开发中,我们不会直接到处写:

    document.cookie = 'age=18;max-age=3600';
    document.cookie = 'name=Tom';
    console.log(document.cookie);

    因为 document.cookie 的 API 非常难用:读取需要自己解析字符串;删除需要设置过期时间;修改和设置逻辑重复。

  2. document.cookie打印的全部,不能根据k值获取

    document.cookie = 'name=Tom';
    document.cookie = 'age=18';
    document.cookie = 'gender=male';
    console.log(document.cookie);//name=Tom; age=18; gender=male

封装:

const cookie = {
set(name, value, maxAge, path = '/') {
document.cookie =
`${encodeURIComponent(name)}=${encodeURIComponent(value)};max-age=${maxAge};path=${path}`;
},
get(name) {
const cookies =
document.cookie.split('; ');
for (let item of cookies) {
const [key, value] =
item.split('=');
if (
decodeURIComponent(key) === name
) {
return decodeURIComponent(value);
}
}
return null;
},
remove(name, path = '/') {
document.cookie =
`${encodeURIComponent(name)}=;max-age=0;path=${path}`;
}
};
cookie.set('name', 'Tom', 3600);
cookie.get('name');
cookie.remove('name');

实际开发中可以使用这个包:js-cookie

Cookies.set('token', 'abc');
Cookies.get('token');
Cookies.remove('token');
  1. 大小限制约 4KB
  2. 数量有限
  3. 自动随请求发送
  4. 不要存敏感信息
  5. HttpOnly 无法被 JS 读取
  6. 删除时 Path/Domain 要一致
  7. 只能存字符串
  8. 特殊字符要编码
  9. 跨域默认不发送 Cookie
  10. 会过期,不适合存重要数据

初识 localStorage#

  • localStorage 是浏览器提供的一种持久化本地存储,它允许前端把数据保存在浏览器本地,即使:刷新页面、关闭浏览器、重新打开浏览器数据依然存在。

为什么会有 localStorage?

  • 以前只有 Cookie,但是 Cookie 有很多缺点:容量小(4KB),自动发送给服务器增加请求体积,所以 HTML5 推出了Web Storage,包括localStorage和sessionStorage

localStorage 的特点

  • 永久保存(除非主动删除)
  • 不会自动发送给服务器
  • 容量大5MB ~ 10MB
  • 同源限制:协议、域名和端口全部相同才能访问

localStorage 的 API

//保存数据
localStorage.setItem('name', 'Tom');
//获取数据
localStorage.getItem('name');//Tom
localStorage.getItem('gender');//null
//删除某一项
localStorage.removeItem('name');
//清空全部
localStorage.clear();
//获取数量
localStorage.length;
//获取第几个 key
localStorage.key(0);

localStorage 只能存字符串

localStorage.setItem('age', 18);
localStorage.getItem('age');//"18" 是字符串

存对象怎么办?

//错误
localStorage.setItem('user', {
name: 'Tom'
});
//正确
const user = {
name: 'Tom',
age: 18
};
localStorage.setItem(
'user',
JSON.stringify(user)
);
//读取
const user = JSON.parse(
localStorage.getItem('user')
);
//结果
{
name: 'Tom',
age: 18
}

实际开发中的使用场景

//保存 Token
localStorage.setItem(
'token',
res.data.token
);
//保存主题
localStorage.setItem(
'theme',
'dark'
);
//保存用户信息
localStorage.setItem(
'userInfo',
JSON.stringify(user)
);
//保存搜索历史
localStorage.setItem(
'history',
JSON.stringify(list)
);

为什么 Token 喜欢放 localStorage?

  • 不会自动发送、容量大、操作简单

localStorage 的缺点

  • 容易被 XSS 攻击,不要把高敏感数据放 localStorage。
  • 不会自动过期,需要自己管理过期时间。
  • 只能存字符串

localStorage 的注意事项#

  • 只能存字符串

  • 关闭浏览器不会消失

  • 没有过期时间,如果要设置过期:

    //存
    localStorage.setItem(
    'token',
    JSON.stringify({
    value: 'abc',
    expire: Date.now() + 3600 * 1000
    })
    );
    //取
    const data = JSON.parse(
    localStorage.getItem('token')
    );
    if (Date.now() > data.expire) {
    localStorage.removeItem('token');
    }
  • 容易被 XSS 攻击

  • 不会自动发送给服务器

  • 同源限制

  • 容量有限制,5MB~10MB

  • 同步 API,会阻塞 JS 主线程。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

前端本地存储
https://f.youzi177.cn/posts/2026102204-qian-duan-ben-di-cun-chu/
作者
小封鸭
发布于
2026-10-22
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
小封鸭
小楼一夜听春雨,深巷明朝卖杏花
公告
欢迎来到我的博客。这里主要记录前端全栈和日常内容
分类
标签
最新动态
站点统计
文章
60
分类
3
标签
12
总字数
107,734
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录