cookie技术
cookie技术
引言:有时你需要记住访客们的一些东西:用户是否登录、用户是否已经投过票、用户权限验证、个性化身份、是否要记住用户登录状态…… 为了能判断这些事情我们可以使用cookie技术。
cookie是存贮在用户电脑中。coockie内的有关信息是通过HTTP文件头来在web服务器和浏览器之间进行交流的.

上边这张图是淘宝首页的一张请求信息图,在这里cookie被自动发送,然后由服务器处理cookie载送的信息。
由于coockie内的有关信息是通过HTTP文件头来在web服务器和浏览器之间进行交流的。因此保持coockie尽可能的小以减少用户的响应时间十分重要。
1. cookie的成分
1. 名称
每一个cookie由唯一的一个名称代表。
2. 值
保存cookie中的字符串值。
3. 域 domain
为了安全,网站不能访问其他域创建的cookie。对于子域,假设我有一个域blog.dxk.com。如果我在www.dxk.com下设置cookie那么在blog.dxk.com下的页面就没有权限访问在www.dxk.com下设置的cookie。但是如果我在www.dxk.com下设置cookie时通过设置domain=dxk.com,那么这里设置的cookie就将与dxk.com的所有子域下的所有目录关联,在blog.dxk.com下的页面就有权限访问在www.dxk.com下设置的cookie。
4. 路径 path
为了安全,设置路径可以限制cookie与服务器的目录关联,如果path=/所有的cookie都将与服务器的根目录及子目录(也就是整个站点)相关联
5. 失效日期 expires
如果没有设定失效日期,那么它将在会话结束时被清除(也就是关闭浏览器时)。
6. 安全标志 secure
用于表示cookie是否只能从安全网站(使用ssl和https协议的网站)中访问。设置了secure属性不代表其他人不能看到你机器本 地保存的cookie。换句话说,把cookie设置为secure,只保证cookie与WEB服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。如果想让本地cookie也加密,需要自己加密数据。
2. cookie约束
浏览器对cookie使用的限制
web浏览器不能存储超过300个cookie,每个域不能存储超过20个cookie,cookie的名值对不能大于4kb。
3. javascript设置cookie
可以用navigator.cookieEnabled 判断浏览器是否支持cookie或者cookie是否被禁用。
每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie,比如:document.cookie=”WUHUI,DXKANDZXHANDMR”;在cookie的名值中不要使用空格、逗号、分号、等号 等符号。cookie值存储之前最好用encodeURIComponent()方法对其进行编码encodeURIComponent("http://www.dxk.com/dxk/test_wuhui/"),使用escape()方法也可以。当使用encodeURIComponent()或escape()编码后,在取出值以后需要使用对应的decodeURIComponent()或unescape()进行解码才能得到原来的cookie值。
设置方法示例:
<script type="text/javascript">
varnowTime = new Date();
nowTime.setMonth(nowTime.getMonth()+24);
document.cookie = "ZXH="+encodeURIComponent("WUHUIAN ;DZXH") +"; path=/; expires="+nowTime.toGMTString()+ "; secure";
alert(document.cookie);
</script>
注意事项:
1. 失效日期为GMT格式的日期(可以用Date对象中的静态方法toGMTString()方法)。如果你设置的日期是一个以前的日期那么这个cookie会被立即清除。
2. 只有字符串中的第一部分是必须的(即名值对),其余的都是可选的。path默认的是设置cookie是的当前目录,过期时间默认的是会话,安全默认的是false。另外比许将名值对写在cookie字符串的第一部分。
3. 在设置cookie的字符串的后边加上; secure则表示把cookie设置成安全的。
cookie常用方法封装:
/**
* @author dxk
* @deprecated cookie操作
*/
var cookie ={
/**
* 新建cookie
* @param {string} name
* @param {string} value
* @param {number} days
*/
"setCookie": function(name, value, days){
if(days) {
vardate = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
varexpires = "; expires=" +date.toGMTString();
}
else{
varexpires = "";
}
varvalues = encodeURIComponent(value);
document.cookie = name + "="+ values + expires + "; path=/";
},
/**
* 获取cookie
* @param {string} name
*/
"getCookie": function(name){
varnameEQ = name + "=";
varcookieArr =document.cookie.split(';');
for(vari = 0; i < cookieArr.length; i++) {
varcurr = cookieArr[i];
// 去除name前边的空格
while(curr.charAt(0) == ' ')
curr= curr.substring(1, curr.length);
if(curr.indexOf(nameEQ) == 0)
returncurr.substring(nameEQ.length, curr.length);
}
returnnull;
},
/**
* 删除cookie
* @param {string} name
*/
"deleteCookie": function(name){
if(name) {
this.setCookie(name, "", "-1");
}
}
};
4. php设置cookie
setcookie($name,$value, $expire, $path, $domain, $secure, $httponly)
示例:
设置cookie
setcookie("zxh", "dxk", time()+30*24*60*60, "/");
if(isset($_COOKIE["zxh"]))
{
echo $_COOKIE["zxh"]; // 获取cookie
}
删除cookie
setcookie("zxh", "", 0, "/");
注意事项:
1. 在php中可以使用以cookie的名称作为键的$_COOKIE结合数组来获取COOKIE的值。不过要确保php.ini中variables_order= "EGPCS"中包含C。
2. cookie 是 HTTP标头的一部分,因此 setcookie()函数必须在其它信息被输出到浏览器前调用,这和对header()函数的限制类似。可以使用输出缓冲函数来延迟脚本的输出,直到按需要设置好了所有的cookie 或者其它 HTTP标头。
3. 也可以使用setrawcookie()但是它不会对cookie value进行url encoding处理
5. 注意事项
1. 因为某些原因cookie的名声很不好。许多人利用cookie做一些卑鄙的事情,比如流量分析、点击跟踪、窃取用户隐私。cookie也不是非常安全,特别是没有secure属性的cookie。不过,即使你用了安全的cookie,如果你和别人共用计算机,比如在网吧,那么别人就 可以窥探计算机硬盘上未加密保存的cookie文件,也就有可能窃取你的敏感信息。所以,如果你是一个WEB开发人员,那么你要认真考虑这些问题。不要滥用cookie。不要把用户可能认为是敏感的数据保存在cookie里。如果把用户的社会保险号、信用卡号等保存在cookie里,等于把这些敏感信 息放在窗户纸下,无异于把用户投到极大危险之中。另外一些cookie数据一定要进行加密
2. 另外,cookie还有一些实际的限制。cookie保留在计算机上,不跟着用户走。如 果用户更换计算机、或者使用不同的浏览器,那么就无法得到原来的 cookie。
3. 此外,如果用户有时不愿意接受cookie,可能会禁用cookie。所以不要以为所有的浏览器都能接受你发出的cookies。不要过分的去依赖cookie。
4. 简而言之,不要依赖cookies的存在;不要在cookie里保存用户的隐私等重要信息;不要保存太多的cookes,去除不必要的coockie使coockie体积尽量小以减少对用户响应的影响;注意在适应级别的域名上设置coockie以便使子域名不受影响;设置合理的过期时间,较早的Expire时间和不要过早去清除coockie,都会改善用户的响应时间;对静态组件的coockie读取是一种浪费,使用另一个无coockie的域名来存放你的静态组件式一个好方法,或者也可以在coockie中只存放带www的域名。

浙公网安备 33010602011771号