一、Cookie简介
Cookie第一次出现是在1994年Netscape浏览器中,到现在已经是最古老、最稳定的客户端存储技术。Cookie使用HTTP header发送,大家都知道,每当浏览器请求一次资源,就会有一组header随请求一起发送,header中包含有关浏览器的信息和数据形式。服务端响应后,又会将header发送回来。由浏览器发送到服务器,又从服务器发送到浏览器。那么你会发现,如果客户端存储的一个优点是不通过网络传送数据,那么来回传送Cookie不是背道而驰吗?是的,这就是不建议完全使用Cookie的原因之一。如今浏览器已不再限制Cookie的数量,但是Web服务器会限制,当Cookie超出限制时,web服务器会抛出异常。通常,每个域名50个、大小总计4KB的Cookie 是安全的,不过这存储不了太多Cookie 值,会影响它们的实际应用。
Cookie对应唯一的域名,也可以对应唯一的子域名,也可以创建对特定路径有效的Cookie,这种设置Cookie位置的方案取决于你的应用用途。此外可以设置Cookie的有效时间:
- 永远存在的Cookie
- 存在特定时长的Cookie
- 特定时间点之后失效的Cookie
- 只在当前会话期间存在的Cookie
二、Cookie的使用
因为Cookie没有API可以调用,使用Cookie,只需直接访问document.cookie对象即可。
1. 创建Cookie
document.cookie = "name = Alice";
创建了一个name为Alice的Cookie。
let name = "Alice";
document.cookie = "name = " + encodeURIComponent(name);
动态定义Cookie,那么就需要使用类似encodeURIComponent的辅助函数。
document.cookie = "name = Alice; expires = Sat Jun 1 2019 20:38:03 GMT+0800";
在Cookie 值后面使用一个分号可以追加元数据,上个例子设置了Cookie 何时过期。
document.cookie = "name = Alice; expires = Sat Jun 1 2019 20:38:03 GMT+0800;domain=mp.youkuaiyun.com";
再追加元数据domain,设置此Cookie只对mp.youkuaiyun.com的域名有效。
当你不这样指定元数据时,Cookie 默认只对当前域名的当前路径有效,有效期是当前会话,直到浏览器关闭时,结束当前会话。
2. 读取Cookie
document.cookie读取Cookie信息,但是无法获取元数据,而是一堆字符串,这显然不是我们期望的,后面会介绍一个小巧方便的cookie.js的库,通过cookie.js可以轻松的读取。
3. 删除Cookie
要删除Cookie,只需要将其过期时间expires设置成过去的时间。
document.cookie = "name = Alice; expires = Sat Jun 1 2018 20:38:03 GMT+0800";
从技术上讲,这个时间值无关紧要,但名称必须与你想要删除的Cookie 名称一致。
4. 利用Cookie.js库
利用一些cookie.js这样的库(例如Vue中可以使用js-cookie的插件),通过这种js库可以非常轻松的操作cookie。
- getItem:获取Cookie
- setItem:设置Cookie(包括有效期、路径、域名等)
- removeItem:删除Cookie
- hasItem:检查Cookie 是否存在
- keys:返回所有Cookie 的名称
// 获取lastVisit的cookie的值
var lastVisit = docCookies.getItem("lastVisit");
// 检查名为lastVisit的cookie是否存在
docCookies.hasItem("lastVisit");
//将lastVisit设为当前时间
docCookies.setItem("lastVisit", new Date(), Infinity);
// 删除cookie
docCookies.removeItem("lastVisit");
5. Cookie可以干什么
cookie可以存储用户的登录信息,访问令牌、token等等,有时候我们利用cookie使用HTTP的header发送,由浏览器发送到服务器,又从服务器发送到浏览器这一特性,就可以确保服务端也可以看到同样的cookie。
- 登录是否过期
- 问候以前从来没有访问过该网站的新用户
- 为隔了一段时间再来访问网站的用户提供重要的信息,比如介绍很酷的新功能
- 简单地欢迎经常访问网站的用户