如何使用cookie
cookie是保存在客户端系统中的一个文本文件,都与指定的Web服务器的域中的固定目录相关联。
当浏览器向服务器请求该目录下的页面时,关联的cookie信息就会随着HTTP请求以头部信息的方式发送给服务器。
在客户端,用户可以使用JavaScript读写cookie信息,服务器端脚本也能够编辑这些cookie信息。
cookie的优点主要表现
简单易用
浏览器负责发送数据
浏览器自动管理不同站点的cookie
经过长期使用,cookie也越来越暴露出先天的不足,具体说明如下使用简单的文本文件储存数据,安全性很差,很容易被黑客窃取
cookie 中存储的数据容量有限,其上限为4KB
存储cookie的数量有限,多数浏览器上限为30或50个,如IE6只支持每个域名20个cookie,也有部分浏览器存储cookie的数量高达300个
如果浏览器的安全配置为最高级别,则cookie会失效
cookie不适合大数据的储存,因为cookie会由每个服务器的请求来传递,从而造成cookie速度缓慢、效率低下
写入cookie信息
- 使用
document.cookie
可以读写cookie字符串信息 - cookie字符串是一组明值对,名称和值之间以等号相连,名值对之间使用分号进行分隔。值中不能包含分号、逗号和空白符。如果包含特殊字符,必须使用 escape()函数对其进行编码,在读取cookie时也必须使用unescape()函数进行解码。
如何使用cookie存储cookie信息
var d = new Date();
d = d.toString();
d = "date=" + escape(d); // 设置 cookie字符串
document.cookie = d; // 写入cookie
在默认状态下,cookie信息只能在当前会话期(当前浏览器窗口)中有效并存在,一旦结束会话(关闭浏览器窗口),这些cookie信息就会被自动删除。
如果长久保存cookie信息,可以设置expires
属性,把字符串"expires=date" 附加到cookie字符串后面,用法如下
name = value; expires = date
date为格林威治日期时间(GTM)格式:Sun,30 Apr 2017 00:00:00 UTC
使用 Date.toGMTString()方法可以快速把时间对象转换为GTM格式。
创建一个有效期为一个月的cookie
var d = new Date(); // 实例化当前日期对象
d.setMonth(d.getMonth() + 1); // 提取月份值并加1,然后重新设置当前日期对象
d = "date=" + escape(d) + ";expires=" +d.toGMTString(); // 在cookie字符串的尾部添加expires 名值对
document.cookie = d; // 写入cookie
cookie 信息是有域和路径限制的。在默认情况下,仅在当前页面路径内有效。其它域或本域其它目录中的文件是无权访问的。
用户可以使用cookie 的 path和domain属性重设可见路径和作用域。
name = value; expires=date; domain=domain; path=path;
如果设置 path=/, 可以设置cookie信息与服务器根目录与其子目录相关联,从而实现在整个网站中共享cookie信息;如果只想让bbs目录下的页面访问,可以设置path=/bbs即可。
很多网站包含多个域名 ,在默认情况下,cookie信息只能在本域中访问,通过设置cookie的domain属性可修改域的范围。domain = baidu.com即可。这样所有baidu.com 的所有子域下的所有页面相关联,包括www、news、tieba等。
cookie使用secure属性定义cookie信息的安全性。secure属性取值包括secure或者空字符串。在默认情况下,secure属性值为空,也就是说cookie信息使用不安全的HTTP链接传递数据。如果一个cookie设置了secure,那么cookie信息在客户端与Web服务器之间传递时,就通过HTTPS或者其他安全协议传递数据
综上所述,比较完善的cookie信息字符串应该包括下面几个部分
- cookie信息字符串,包含一个名/值对,默认为空
- cookie有效期,包含一个GTM格式的字符串,默认为当前会话期(即如果没有设置,则当关闭浏览器时,cookie信息就因过期而被清除)
- cookie有效路径,默认为cookie所在页面目录及其子目录
- cookie有效域,默认为设置cookie的页面所在的域
- cookie安全性,默认为不采用安全加密措施进行传递
下面把写入cookie信息的实现代码进行封装
// 写入cookie
// 参数 name表示cookie名称,value表示cookie值,expirs表示有效天数,path表示有效路径,domain表示域,secure表示安全性设置。其中name、value、path、和domain参数为字符串类型,传递时需要加上引号,而参数expirs为数值,secure表示布尔值,表示是否加密传输cookie信息
// 返回值:无
function setCookie( name,value,expires,path,domain,secure){
var today = new Date();
today.setTime( today.getTime());
if(expires){
expires = expires * 1000 * 60 * 60 * 24;
}
var expires_date = new Date( tody.getTime() + (expires) );
document.cookie = name + "=" + escape(value) +
( (expires) ? ";expires=" + expires_date.toGTMString() : "" ) +
( (path) ? ";path=" + path : "" ) +
( (domain) ? ";domain=" +domain : "") +
( (secure) ? ";secure=" : "" );
}
读取cookie信息
访问 document.cookie可以读取cookie信息,cookie属性值是一个由零个或多个名值对的字符串组成的字符串列表,每个名值对之间通过分号进行分隔。
把cookie字符串转换成对象类型
// 把cookie字符串转换为对象类型
// 参数:无
// 返回值:对象,储存cookie信息,其中名称作为对象的属性而存在,而值作为属性值而存在
function getCookie(){
var a = document.cookie.split(";"); // 把cookie字符串分为数组
var o = { }; // 临时对象直接量
for(var i = 0;i<a.length; i++){ // 遍历数组
var v = a[i].split("="); // 劈开每个数组元素
o[v[0]] = v[1]; // 把元素的名和值转换为对象的属性和属性值
}
return o; // 返回对象
}
如果写入cookie进行了编码,读取时要记得解码
===================
// 在实际开发中,更多的操作是直接读取某个cookie值,而不是读取所有cookie信息。
// 读取指定cookie信息
// 参数:cookie名称
// 返回值:cookie值
function getCookie(name){
var start = document.cookie.indexOf(name + " = "); // 提取cookie中与名称相同的字符串索引
var len = start + name.length + 1; // 计算值的索引位置
if((!start)&&(name!=document.cookie.subString(0,name.length))){
// 不存在则返回null 此处的判断就是需要注意0是false
return null;
}
if(start == -1) return null; // 如果没有找到,则返回null
var end = document.cookie.indexOf(";",len);// 获取值后面“;”的索引位置
if(end == -1) end = documen.cookie.length; // 如果索引值为-1,设置为cookie字符串的长度
return unescape(documen.cookie.substring(len,end));// 获取名称对应的截取值,并解码返回
}
修改和删除cookie信息
如果要改变指定cookie的值,只需要使用相同名称和新值重新设置该cookie即可。如果要删除某个cookie信息,只需要为该cookie设置一个已过期的expires属性值
// 封装一个删除指定cookie信息的方法,这个方法需要调用getCookie()函数
// 删除指定cookie 信息
// 参数:name表示cookie名称,path表示所在路径,domain表示所在域
// 返回值
function deleteCookie(name,path,domain){
if(getCookie(name)) document.cookie = name + " = "+ // 如果名称存在,则清空
((path)?";path=" + path : "")+ // 如果存在路径,则加上
((domain)? ";domain=" +domain : "")+ // 如果存在域,则加上
"expires=Thu,01-Jun-1970 00:00:01 GTM";
// 设置有效期为过去时,即表示该cookie无效,将会被浏览器清除
}
附加cookie信息
切记请勿滥用cookie浏览器对cookie都有个数限制,为了避免超出这个限制,可以把多条信息都保存在一个cookie中,而不是为每条信息都新建一个cookie。由于cookie可存储的字符串最大长度为4kb(即4096个字符)
// 在cookie中存储更多的信息。
// 定义有效期
var d = new Date();
d.setMonth(d.getMonth() + 1);
d = d.toGMTString();
// 定义cookie字符串
var a = " name:a,age:20,addr:beijin" //子名/值串
var c = "user=" + escape(a) // 组合cookie字符串
c += ";" + "expires=" +d; // 设置有效期为1个月
document.cookie = c; // 写入cookie信息