cookie的那些事
2018-01-20 本文已影响36人
tiancai啊呆
cookie简介
cookie 是服务器保存在浏览器的一小段文本信息,浏览器每次向服务器发出请求,就会自动附上这段信息。
cookie详解
- cookie的属性
一条cookie主要保存了五个方面的信息,分别是cookie的名字,cookie的值,到期时间,所属域名(默认是当前域名),生效路径(默认是当前网址)。 - cookie的长度
所有 cookie 的累加长度限制为4KB。超过这个长度的 Cookie,将被忽略,不会被设置。 - cookie的通信
浏览器每次请求时,在请求头中通过Cookie字段将cookie发送给服务器。
服务器在响应头中,通过Set-Cookie字段将cookie发给浏览器。如果服务器加上了HttpOnly属性,则这个 cookie 无法被 JavaScript 读取。
不同的是浏览器向服务器发送 cookie 的时候,是使用一行将所有 cookie 全部发送,而服务器告诉浏览器需要储存 cookie 的时候,则是分行指定。 - cookie的获取
浏览器通过document.cookie
返回当前网页的 cookie(返回的是分号分隔的所有 cookie)。所以必须手动还原,才能取出每一个 cookie 的值。 - cookie的设置
document.cookie
属性是可写的,可以通过它为当前网站添加 cookie。但是,document.cookie
一次只能写入一个 cookie,而且写入并不是覆盖,而是添加。
写入格式:value;expires=date;domain=domain;path=path;secure
value属性是必需的,它是一个键值对,用于指定cookie的值(对分号、逗号和空格进行转义)。
expires属性用于指定 cookie 过期时间。它的格式采用Date.toUTCString()
的格式。
domain属性指定 cookie 所在的域名。如果未指定,默认为设定该Cookie的域名。所指定的域名必须是当前发送Cookie的域名的一部分。
path属性用来指定路径,必须是绝对路径。如果未指定,默认为请求该 Cookie 的网页路径。path属性生效的前提是domain属性匹配。
secure属性用来指定cookie只能在加密协议HTTPS下发送到服务器,只是一个开关,不需要指定值。
max-age属性用来指定cookie有效期,单位为秒。
HttpOnly属性用于设置该cookie不能被JavaScript读取。
以上可选属性可以同时设置一个或多个,也没有次序的要求。另外,这些可选属性只能用来设置 cookie。一旦设置完成,就没有办法读取这些可选属性的值。
如果想改变一个早先设置的Cookie,必须同时满足四个条件:cookie的key、domain、path和secure都匹配。
- cookie的删除
删除一个cookie唯一方法是使其过期。
cookie封装
//设置cookie
function setCookie(key,value,expires,domain,path) {
var encodeKey = encodeURIComponent(key);
var encodeValue = encodeURIComponent(value);
var keyExpires = expires.toUTCString();
document.cookie = encodeKey + '=' + encodeValue + ';expires=' + keyExpires + ';domain=' + domain + ';path=' + path;
}
//获取cookie
function getCookie(key){
var encodeKey = encodeURIComponent(key);
var allCookie = document.cookie.split(';');
var cookie,len = allCookie.length;
for (var i = 0; i < len; i++) {
cookie = allCookie[i].split('=');
if (encodeKey == cookie[0]) {
return cookie[1];
}
}
return '';
}
//删除cookie
function delCookie(key,domain,path){
var encodeKey = encodeURIComponent(key);
var expires = new Date(0);
document.cookie = encodeKey + '=' + ';expires=' + expires.toUTCString() + ';domain=' + domain + ';path=' + path;
}
最后推荐一下自己的通用函数库