Storage不会自动把数据发送给服务器,仅在本地保存
Storage也有存储大小的限制,但比cookie大得多,可以达到5M或更大
数据有效期不同
作用域不同
webStorage支持事件通知机制,可以将数据更新的通知发送给监听者
webStorage的api接口使用更方便
xxxStorage.setItem('key','value')xxxStorage.getItem('key')xxxStorage.removeItem('key')xxxStorage.clear()以localStorage举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>localStorage</title>
</head>
<body>
<h2>localStorage</h2>
<button onclick="saveData()">点我保存一个数据</button>
<button onclick="readData()">点我读取一个数据</button>
<button onclick="deleteData()">点我删除一个数据</button>
<button onclick="deleteAllData()">点我删除所有数据</button>
<script>
let p = {
name: '张三',
age: 18
}
function saveData() {
localStorage.setItem('msg','hello!!!')
localStorage.setItem('person',JSON.stringify(p))
}
function readData() {
console.log(localStorage.getItem('msg'));
consoloe.log(JSON.parse(localStorage.getItem('person')))
}
function deleteData() {
localStorage.removeItem('msg')
}
function deleteAllData() {
localStorage.clear()
}
</script>
</body>
</html>
var lsc = (function(self){
var prefix = 'one_more_lsc_'
// 增加一个键值对数据
self.set = function(key, val, expires) {
key = prefix + key
val = JSON.stringify({'val': val, 'expires': new Date().getTime() + expires * 1000})
localStorage.setItem(key, val)
}
// 读取对应键的值
self.get = function (key) {
key = prefix + key;
var val = localStorage.getItem(key)
if (!val) {
return null;
}
val = JSON.parse(val);
if (val.expires < new Date().getTime()) {
localStorage.removeItem(key);
return null;
}
return val.val
}
return self;
}(lsc || {}));
每隔1s执行一次定时删除,操作如下:
var lsc = (function (self) {
var prefix = 'one_more_lsc'
var list = [];
// 初始化list
self.init = function () {
var keys = Object.keys(localStorage)
var reg = new RegExp('^' + prefix);
var temp = []
// 遍历所有localStorage中的所有key
for (var i = 0; i < keys.length; i++) {
// 找出可过期缓存的key
if (reg.test(keys[i])) {
temp.push(keys[i])
}
}
list = temp;
}
self.init();
self.check = function () {
if (!list || list.length == 0) {
return
}
var checkCount = 0
while(checkCount < 500) {
var expireCount = 0
// 随机测试20个设置了过期时间的key
for (var i = 0; i < 20; i++) {
if(list.length == 0) {
break;
}
var index = Math.floor(Math.random() * list.length);
var key = list[index];
var val = localStorage.getItem(list[index])
// 从list中删除被惰性删除的key
if(!val) {
list.splice(index, 1);
expireCount++;
countinue;
}
val = JSON.parse(val)
// 删除所有发现的已过期的key
if (val.expires < new Date().getTime()) {
list.splice(index, 1);
localStorage.removeItem(key)
expireCount++
}
}
// 若删除的key不超过5个则跳出循环
if (expiresCount <= 5 || list.length == 0) {
break
}
}
// 每隔1s执行一次定时删除
window.setInterval(self.check,1000)
return self;
}
}(lsc || {}))
JSON.stringfy()将JSON对象转换为字符串cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和 服务器间来回传递
存储大小限制不同: cookie数据不能超过4K
数据有效期不同:cookie只在设置的cookie过期时间之前有效,即使窗口关闭或者浏览器关闭
作用域不同: 在所有同源窗口中都是共享的
document.cookie = "name=value;expires=evalue;path=pvalue;domain=dvalue;secure;" document.cookie="name=中文";
//为了防止中文乱码,我们可以使用encodeURIComponent()编码;decodeURIComponent()解码
document.cookie = encodeURIComponent("name")+"="+encodeURIComponent("中文")
function setCookie(objName, objValue, objHours) { // 添加cookie
var str = objName + '=' + encodeURIComponent(objValue);
if (objHours > 0) { // 为0时不设定过期时间,浏览器关闭时cookie自动消失
var date = new Date();
var ms = objHours * 3600 * 1000;
date.setTime(date.getTime() + ms);
str += ";expires=" + date.toUTCString();
}
document.cookie = str
}
// 获取cookie
function getCookie(objName) { // 获取指定名称的cookie值
// 多个cookie保存的时候是以; 分开的
var arrStr = document.cookie.split("; ");
for (var i = 0; i < arrStr.length; i++) {
var temp = arrStr[i].split("=");
if (temp[0] == objName) {
return decodeURIComponent(temp[1])
} else {
return "";
}
}
// 为了删除指定名称的cookie,可以将过期时间设定为一个过去的时间
function delCookie(name) {
var date = new Date();
date.setTime(date.getTime() - 10000);
document.cookie = name + "=a; expires=" + date.toUTCString();
}
}
cookie可能被禁用,当用户非常注重个人隐私保护时,可能被禁用
cookie是与浏览器相关的
cookie可能被删除,cookie就是硬盘上的一个文件,可能被用户删除
cookie安全性不够高,所有的cookie都是以纯文本的形式记录在文件中,要保护用户名密码等信息时,最好实现经过加密处理
cookie在保存时,只要后面保存的name相同,就覆盖前面的cookie