遇到一些问题需要用cookie处理,正好读了一下犀牛书关于cookie的介绍,整理了一些笔记。
cookie是指web浏览器存储的少量数据,同时它是与具体的web页面或者站点相关的。
cookie数据会自动在web浏览器和web服务器之间传输,因此服务器端脚本就可以读、写存储在客户端的cookie值。
在JavaScript中,cookie用于保存状态以及能够为web浏览器提供一种身份识别机制。
但是在JavaScript中使用cookie不会采用任何加密机制,因此它们是不安全的。但是,通过https来传输cookie数据是安全的,不过这和cookie本身无关,而和https:协议有关。
cookie属性:有效期和作用域
除了名(name)和值(value),cookie还有一些可选的属性来控制cookie的有效期和作用域。
cookie的作用域是通过文档源和文档路径来确定的。该作用域通过cookie 的path和domain属性也是可配置的。
但是值得注意的是,cookie的path属性不能被用做访问控制机制。
cookie 的作用域默认由文档源限制。但是,有的大型网站想要子域之间能够相互共享cookie。这个时候就需要通过设置cookie的domain属性来达到目的。
cookie的域只能设置为当前服务器的域。
cookie的属性是secure ,它是一个布尔类型的属性,用来表明cookie的值以何种形式通过网络传递。
cookie默认是以不安全的形式(通过普通的、不安全的HTTP连接)传递的。
而一旦cookie被标识为"安全的",那就只能当浏览器和服务器通过https或者其他的安全协议连接是才能传递它。
保存cookie
给当前文档设置默认有效期的cookie值:
name = value;
document.cookie = "version = " + encodeURLComponent(document.lastModified);
由于cookie的名/值中的值是不允许包含分号、逗号和空白符,因此,在储存前一般可采用JavaScript核心全局函数encodeURLComponent()对值进行编码。
相应的,读取cookie值的时候需要采用decodeURLComponent()进行解码。
延长cookie的有效期,需要设置max-age属性来指定cookie的有效期(单位是秒)。
name = value;max-age = seconds;
通过一个函数来设置一个cookie,同时提供一个可选的max-age属性:
/*
*以名/值的形式储存cookie
*同时采用encodeURLComponent()函数进行编码,来转义分号、逗号和空白符
*如果daysToLive是一个数字,设置max-age属性为该属性值表示cookie直到指定的天数。
*到了才会过期。如果daysToLive是0就表示删除cookie
*/
function setcookie(name,value,daysToLive) {
var cookie = name + "=" encodeURLComponent(value);
if(typeof daysToLive ==="number")
cookie += "; max-age = " + (daysToLive*60*60*4);s
document.cookie = cookie;
}
如果要设置cookie的path、domain和secure属性,只需在存储cookie值前,以如下字符串形式追加在cookie值后面:
;path = paht
;domain = domain
;secure
要改变cookie的值,需要使用相同的名字、路径和域,但是新的值重新设置cookie的值。
同样的,设置新的max-age属性就可以改变原来cookie的有效期。
要删除一个cookie,需要使用相同的名字、路径和域,然后指定一个任意(非空)的值,并且将max-age属性指定为0,再次设置cookie
读取cookie
使用JavaScript表达式来读取cookie属性的时候,返回的值是一个字符串,该字符串都是由一系列名/值对组成,
不同名/值对之间通过”分号和空格“分开,其内容包含了所有作用在当前文档的cookie。
但是,它并不包含其他设置的cookie属性。通过document.cookie属性可以获取cookie的值,但是为了更好的查看cookie的值,
一般会采用split()方法将cookie值中的名/值对分离出来。
定义一个getcookie()函数,该函数将document.cookie属性的值解析出来,将对应的名/值对储存到一个对象中,函数最后返回该对象。
解析document.cookie属性值
/*
*将document.cookie的值以名/值对组成的一个对象返回
*假设储存cookie的值的时候是采用encodeURLComponent()函数编码的
*/
function getcookie(){
var cookie = {}; //初始化最后要返回的对象
var all = document.cookie; //在一个大写字符串中获取所有的cookie值
if (all === "") { //如果该cookie属性值为空字符串
return cookie; //返回一个空对象
}
var list = all.split(";");//分离出名/值对
for(var i = 0;i<list.length;i++) { //遍历每个cookie
var cookie = list[i];
var p = cookie.indexOf("="); //找到第一个”=“符号
var name = cookie.substring(o,p); //获取cookie名字
var value = cookie.substring(p+1); //获取cookie对应的值
value = decodeURLComponent(value);//对其进行解码
cookie[name] = value; //将名/值对储存到对象中
}
retuen cookie;
}