前端本地存储
初识 Cookie
- 浏览器存储在本地的一小段字符串数据,用来保存用户状态。所以敏感信息不要放在Cookie
- 一般会自动随着浏览器每次请求发送到服务器上(修改网站语言)
Cookie有什么用
- Cookie跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等利用(Cookie + JS + 后端日志 + 大数据系统)
在浏览器操作Cookie
- 谷歌浏览器-F12控制台-Application-Cookie-网站 输入KV值
document.cookie能输出刚才的Cookie
Cookie 的基本用法
写入Cookie
//写入 document.cookie = 'username = youzi'; document.cookie = 'age = 18'; // 不能一起写入 //document.cookie = 'username = youzi;age = 18';读取Cookie
console.log(document.cookie);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 发送 |
| HttpOnly | JS 不可访问 |
| SameSite | 防止 CSRF |
| Partitioned | 第三方 Cookie 分区 |
Cookie 的封装
为什么封装?
-
语法难用
实际开发中,我们不会直接到处写:
document.cookie = 'age=18;max-age=3600';document.cookie = 'name=Tom';console.log(document.cookie);因为
document.cookie的 API 非常难用:读取需要自己解析字符串;删除需要设置过期时间;修改和设置逻辑重复。 -
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');Cookie 的注意事项
- 大小限制约 4KB
- 数量有限
- 自动随请求发送
- 不要存敏感信息
- HttpOnly 无法被 JS 读取
- 删除时 Path/Domain 要一致
- 只能存字符串
- 特殊字符要编码
- 跨域默认不发送 Cookie
- 会过期,不适合存重要数据
初识 localStorage
localStorage是浏览器提供的一种持久化本地存储,它允许前端把数据保存在浏览器本地,即使:刷新页面、关闭浏览器、重新打开浏览器数据依然存在。
为什么会有 localStorage?
- 以前只有 Cookie,但是 Cookie 有很多缺点:容量小(4KB),自动发送给服务器增加请求体积,所以 HTML5 推出了Web Storage,包括localStorage和sessionStorage
localStorage 的特点
- 永久保存(除非主动删除)
- 不会自动发送给服务器
- 容量大5MB ~ 10MB
- 同源限制:协议、域名和端口全部相同才能访问
localStorage 的 API
//保存数据localStorage.setItem('name', 'Tom');//获取数据localStorage.getItem('name');//TomlocalStorage.getItem('gender');//null//删除某一项localStorage.removeItem('name');//清空全部localStorage.clear();//获取数量localStorage.length;//获取第几个 keylocalStorage.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}实际开发中的使用场景
//保存 TokenlocalStorage.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 主线程。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!














