Cookie的使用必须基于web服务器,因为Cookie的操作会跟随http请求进行。
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
Cookie 并不是它的原意“甜饼”的意思,而是一个保存在客户机中的简单的文本文件,这个文件与特定的 Web 文档关联在一起,保存了该客户机访问这个Web 文档时的信息,当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性,因此它可以帮助我们实现记录用户个人信息的功能,而这一切都不必使用复杂的CGI等程序 。
举例来说,一个 Web 站点可能会为每一个访问者产生一个唯一的ID,然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web,会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名,就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存) 。
Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。
对于前端来讲,Cookie可以存储一些临时数据,在页面之间共享,并且可以在页面关闭后,再开打开,还可以继续获取。
我们在语雀的网站控制台中,打印一下document.cookie
可以获取一个有规律的字符串。
在浏览器中,如果想要查看当前域名下的Cookie,也可以在开发者工具中,选择应用程序,查看。
我们在控制台打印的document.cookie
其实本质上,就是对应的应用程序的Cookie
我们可以使用document.cookie
进行查看。因为这个操作可以获取到所有的Cookie,不能获取到单独的某个Cookie,所以我们就需要封装一个函数。
最简单的新增Cookie的方式,我们可以使用
document.cookie="key=value"
执行上面的代码后,我们可以在document.cookie
中看到原本的字符串里,多了一个key=value
注:Cookie需要借助Web服务器,以文件形式打开的页面,无法使用Cookie。
使用web服务器之后,就可以正常看到我们设置的Cookie。
设置好Cookie后,通过document.cookie
可以查看对应的Cookie
document.cookie="key=value;expires=标准的时间格式"
标准的时间格式,是通过new Date().toUTCString()
// 设置10天后过期
new Date(Date.now() + 10 * 24 * 60 * 60 * 1000).toUTCString()
我们可以自己封装cookie相关的操作,但是这种操作不是很方便,我们可以利用第三方插件来解决这些问题。
Cookies.set(key, value)
Cookies.set(key, value, {
expires: 7 // 7天后过期 也可以写过期时间的日期对象
})
Cookies.get(key) // 获取到单个的cookie
Cookies.get() // 获取到所有的cookie
Cookies.remove(key)
Cookies.set(已存在的key, 新的值)
为什么学习Web Storage ?
在HTML5之前,我们通常使用Cookie进行数据存储,例如在本地设备上存储历史活动的信息,但这种方式的缺点是存储的空间大小只有4KB左右,存储的数据解析起来比较复杂。
为此,HTML5提出了网络存储的相关解决方案,即Web Storage(Web存储)。
可以将数据存储在本地,如保存用户的偏好设置、复选框的选中状态、文本框默认填写的值等。用户在浏览器中刷新网页时,网页通过Web Storage就可以知道用户之前所做的一些修改,而不需要将用户修改的内容存储在服务器端。
Web Storage中包含两个关键的对象,都是Web Storage的实例,都能使用Web Storage接口提供的方法和属性。
本地存储,它可以将数据按照键值对的方式保存在浏览器中,直到用户或者脚本主动清除数据,否则该数据会一直存在。也就是说,使用了本地存储的数据将被持久化保存。
拓展了Cookie的4KB限制,并且可以将第一次请求的数据直接存储到本地,其容量相当于一个5MB大小的数据库。
方法/属性 | 描述 |
---|---|
key(n) | 该方法用于返回localStorage对象中第n个key的名称 |
setItem(key,value) | 该方法接收键名和值作为参数,将会把键值对存储到localStorage中,如果键名存在,则更新其对应的值 |
getItem(key) | 该方法接收一个键名作为参数,返回键名对应的值 |
removeItem(key) | 该方法删除键名为key的存储内容 |
clear() | 该方法清空所有存储内容 |
length | 该属性返回localStorage对象中包含的item的数量 |
<input type="text" id="username">
<button id="setData">设置数据button>
<button id="getData">获取数据button>
<button id="delData">删除数据button>
<script>
var username = document.querySelector('#username');
// 单击“设置数据”按钮,设置数据
document.querySelector('#setData').onclick = function () {
var val = username.value; // 获取username里面的值
localStorage.setItem('username', val);
};
// 单击“获取数据”按钮,获得数据
document.querySelector('#getData').onclick = function () {
alert(localStorage.getItem('username'));
};
// 单击“删除数据”按钮,删除数据
document.querySelector('#delData').onclick = function () {
localStorage.removeItem('username');
};
script>
与localStorage对象的方法和属性类似。
<input type="text" id="username">
<button id="setData">设置数据button>
<script>
var username = document.querySelector('#username');
// 单击“设置数据”按钮,设置数据
document.querySelector('#setData').onclick = function () {
var val = username.value; // 获取username里面的值
sessionStorage.setItem('username', val);
};
script>
当使用Web Storage存储的数据发生变化时,会触发window对象的storage事件。我们可以监听该事件并指定事件处理函数,当其他页面中的localStorage或sessionStorage中保存的数据发生改变时,就会执行事件处理函数。
// window.addEventListener(事件名, 事件处理函数);
window.addEventListener('storage', function (event) {
console.log(event.key);
});
事件处理函数接收一个event对象作为参数,event对象的key属性保存发生变化的数据的键名。
属性 | 描述 |
---|---|
event.key | 获取在sessionStorage或localStorage中被修改的数据键值 |
event.oldValue | 获取在sessionStorage或localStorage中被修改前的值 |
event.newValue | 获取在sessionStorage或localStorage中被修改后的值 |
event.url | 获取在sessionStorage或localStorage中值的页面URL地址 |
event.storageArea | 获取变动的sessionStorage对象或localStorage对象 |
storage事件并不在导致数据变化的当前页面触发。
如果浏览器同时打开一个域名下面的多个页面,当其中的一个页面改变sessionStorage或localStorage的数据时,其他所有页面的storage事件会被触发,而原始页面并不触发storage事件。通过这种机制,可以实现多个页面之间的通信。
由于sessionStorage无法在不同标签页的网页中互相访问数据,当使用storage事件时,可以将页面放在标签创建的框架中,此时在框架内通过storage事件可以监听外层页面的sessionStorage的数据变化。
<label>用户名:label> <input type="text" id="username">
<button id="save">保存button>
<script>
var username = document.querySelector('#username');
// 单击“保存”按钮,设置数据
document.querySelector('#save').onclick = function () {
var val = username.value; // 获取username里面的值
localStorage.setItem('username', val);
};
script>
<span>新的用户名:span>
<span id="newval">span>
<br>
<span>旧的用户名:span>
<span id="oldval">span>
<script>
var newdata = document.getElementById('newval');
var olddata = document.getElementById('oldval');
window.addEventListener('storage', function (e) {
newdata.innerHTML = e.newValue; // 设置元素的内容为修改后的值
olddata.innerHTML = e.oldValue; // 设置元素的内容为修改前的值
});
script>