对大网站使用cookie的一些见解

COOKIE在一般的网站都经常用到。
下面是最简单的读取和设置COOKIE的代码。

function getCookie(name){
return (document.cookie.match(new RegExp("(^"+name+"| "+name+")=([^;]*)"))==null)?"":decodeURIComponent(RegExp.$2);
}
function setCookie(name,value,hours){
if(arguments.length>2){
var expireDate=new Date(new Date().getTime()+hours*3600000);
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=xunlei.com; expires=" + expireDate.toGMTString() ;
}else
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=xunlei.com";
}


假设我们是在一个较大的IT公司里,应用非常多,我们也有不同的域名。虽然我们可以直接往xunlei.com下面加cookie,使所有项目可以共用COOKIE,但是这样会导致cookie数量越来越多,不好管理。而且IE有COOKIE数量限制(某些低版本的IE是20个),可能导致COOKIE丢失,因此,我们需要分域名存放。假设我们现在的WEB项目的域名是vip.xunlei.com,于是代码会变成这样:


function getCookie(name){
return (document.cookie.match(new RegExp("(^"+name+"| "+name+")=([^;]*)"))==null)?"":decodeURIComponent(RegExp.$2);
}
function setCookie(name,value,hours,isBaseDomain){
if(arguments.length>2){
var expireDate=new Date(new Date().getTime()+hours*3600000);
if(isBaseDomain != undefined && isBaseDomain == 1){
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=xunlei.com; expires=" + expireDate.toGMTString() ;
}else{
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=vip.xunlei.com; expires=" + expireDate.toGMTString() ;
}
}else
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=vip.xunlei.com";
}

不过这样还是不够的。假设vip.xunlei.com是一个大部门,这个部门旗下有多个产品,各个产品都有一个三级域名,例如productA.vip.xunlei.com,productB.vip.xunlei.com,productC.vip.xunlei.com
每个产品由不同的开发人员负责。假设某些业务逻辑要求往vip.xunlei.com这个域下写cookie,那么一旦cookie数量超过了20个,仍会产生上面的cookie丢失的问题。要解决这个问题,就必须减少cookie的数量。(一般不需要理会cookie总大小的问题,一般浏览器至少支持4K=4096字节的信息)。有一个较好的解决方法就是将cookie压缩到一个项里面去,因为浏览器不限制单个cookie的大小,只要不超过总容量即可,用key1=val1&key2=val2&key3=val3.....这样的形式合并成一个cookie字段。
下面是实现的代码。

/*
* 2010-08-06
* 由于很多应用需要写cookie到vip.xunlei.com这个域下,
* 容易导致cookie数量过多被挤掉,因此改写cookie类,将
* 大部分cookie放在一个公共的vipcookie项中去。
* 数据存储形式为 key1=val1&key2=val2&key3=val3....
*/
function getCookie(name){
var val = getRealCookie(name);
if(val.trim() == ''){
var vipcookie = getRealCookie('vipcookie');
if(vipcookie.trim()==''){
return '';
}
var cookies = vipcookie.split('&');
for(var i=0;i<cookies.length;i++){
ary = cookies[i].split('=');
if(ary.length>1 && ary[0] == name){
return decodeURIComponent(ary[1]);
}
}
return '';
}else{
return val.trim();//如果cookie中有该值,优先使用该值
}
}
//每个值都已进行encodeURIComponent,不必担心是否跟分界符=,&冲突
function setCookie(name,value,hours,isBaseDomain){
value = value + '';
if(isBaseDomain != undefined && isBaseDomain == 1){
setRealCookie(name,value,hours,1);
}else{
var vipcookie = getRealCookie('vipcookie');
if(value.trim()==''){//删除cookie
if(vipcookie!=''){
var check = getCookie(name);
if(check!=''){
var cookies = vipcookie.split('&');
var newcookie = new Array;
for(var i=0;i<cookies.length;i++){
ary = cookies[i].split('=');
if(ary.length>1 && ary[0] != name){
newcookie.push(cookies[i]);
}
}
vipcookie = newcookie.join('&');
}
}
}else{//添加cookie

//删除原生cookie中的此值
setRealCookie(name,'',0);

if(vipcookie==''){
vipcookie = name.trim()+'='+encodeURIComponent(value);
}else{
//check if has the same item , if so , replace it , otherwise add it.
var check = getCookie(name);
if(check!=''){
var cookies = vipcookie.split('&');
for(var i=0;i<cookies.length;i++){
ary = cookies[i].split('=');
if(ary.length>1 && ary[0] == name){
cookies[i] = name+'='+encodeURIComponent(value);
break;
}
}
vipcookie = cookies.join('&');
}else{
vipcookie = vipcookie+'&'+name.trim()+'='+encodeURIComponent(value);
}
}
}

if(hours != undefined){
setRealCookie('vipcookie',vipcookie,hours);
}else{
setRealCookie('vipcookie',vipcookie);
}
}
}
function getRealCookie(name){
return (document.cookie.match(new RegExp("(^"+name+"| "+name+")=([^;]*)"))==null)?"":decodeURIComponent(RegExp.$2);
}
function setRealCookie(name,value,hours,isBaseDomain){
if(arguments.length>2){
var expireDate=new Date(new Date().getTime()+hours*3600000);
if(isBaseDomain != undefined && isBaseDomain == 1){
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=xunlei.com; expires=" + expireDate.toGMTString() ;
}else{
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=vip.xunlei.com; expires=" + expireDate.toGMTString() ;
}
}else
document.cookie = name + "=" + encodeURIComponent(value) + "; path=/; domain=vip.xunlei.com";
}
/* +++++++++++++++++++++ cookie类结束 +++++++++++++++++++++ */

代码解释:getRealCookie和setRealCookie就是上面的基本cookie读写函数。
getCookie和setCookie是对vipcookie这个cookie进行读写的函数。如果原生cookie中已有相应的值,则优先使用原生cookie中的值。这样就能做到向下兼容的效果。

在这里,我们使用的公共cookie项的名称是vipcookie,可根据自己的需要修改。
通过这样修改后,我们各个项目间的cookie终于可以和平相处,不会产生丢失的现象了。
以上仅仅是我一点小小的经验而已,欢迎大家拍砖。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值