cookie
一、什么是cookie
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
要跟踪该会话,必须引入一种机制。
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
二、cookie的使用
JS读取cookie:
假设cookie中存储的内容为:name=jack;password=123
则在B页面中获取变量username的值的JS代码如下:
var username=document.cookie.split(";")[0].split("=")[1];
1 //设置cookie 2 function setCookie(name,value) 3 { 4 var Days = 30; 5 var exp = new Date(); 6 exp.setTime(exp.getTime() + Days*24*60*60*1000); 7 document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); 8 } 9 10 //获取cookie 11 function getCookie(name) 12 { 13 var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); 14 if(arr=document.cookie.match(reg)) 15 return unescape(arr[2]); 16 else 17 return null; 18 } 19 //删除cookies 20 function delCookie(name) 21 { 22 var exp = new Date(); 23 exp.setTime(exp.getTime() - 1); 24 var cval=getCookie(name); 25 if(cval!=null) 26 document.cookie= name + "="+cval+";expires="+exp.toGMTString(); 27 } 28 //使用示例 29 setCookie("name","hayden"); 30 alert(getCookie("name")); 31 //如果需要设定自定义过期时间 32 //那么把上面的setCookie 函数换成下面两个函数就ok; 33 //程序代码 34 function setCookie(name,value,time) 35 { 36 var strsec = getsec(time); 37 var exp = new Date(); 38 exp.setTime(exp.getTime() + strsec*1); 39 document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); 40 } 41 function getsec(str) 42 { 43 alert(str); 44 var str1=str.substring(1,str.length)*1; 45 var str2=str.substring(0,1); 46 if (str2=="s") 47 { 48 return str1*1000; 49 } 50 else if (str2=="h") 51 { 52 return str1*60*60*1000; 53 } 54 else if (str2=="d") 55 { 56 return str1*24*60*60*1000; 57 } 58 } 59 //这是有设定过期时间的使用示例: 60 //s20是代表20秒 61 //h是指小时,如12小时则是:h12 62 //d是天数,30天则:d30 63 setCookie("name","hayden","s20");
三、缺点
1.数据大小:4kb,只能存储一些简单的字段
2.安全性:在http中cookie是明文传输,有比较大的安全性
3.网络负担:cookie会被附加在每一个http请求中,增加不必要的流量损失。
四、cookie跨域
cookie具有两个重要属性:
1、domain-域
通过设置这个属性可以使多个web服务器共享cookie。domain属性的默认值是创建cookie的服务器的主机名。不能将一个cookie的域设置成服务器所在的域之外的域。
举个例子:
让位于a.taotao.com的服务器能够读取b.taotao.com设置的cookie值。如果b.taotao.com的页面创建的cookie把 它的path属性设置为”/”,把domain属性设置成”.taotao.com”,那么所有位于b.taotao.com的网页和所有位于 a.taotao.com的网页,以及位于taotao.com域的其他服务器上的网页都可以访问(或者说是得到)这个cookie。
2、path-路径
表示创建该cookie的服务器的哪些路径下的文件有权限读取该 cookie,默认为/,就是创建该cookie的服务器的根目录。
js设置跨域:
1 function setCookie_log (c_name,value,domain){ 2 var exdate = new Date(), expiredays = 365; 3 exdate.setDate(exdate.getDate() + expiredays); 4 //判断是否需要跨域存储 5 if (domain) { 6 document.cookie = c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString())+";path=/;domain=xueersi.com"; 7 } else { 8 document.cookie = c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString())+";path=/"; 9 } 10 }