`
凉粉仔
  • 浏览: 40765 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

对大网站使用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终于可以和平相处,不会产生丢失的现象了。
以上仅仅是我一点小小的经验而已,欢迎大家拍砖。
分享到:
评论

相关推荐

    JS面向对象编程 for Cookie

    各位如果有更好的见解可讨论下! 代码如下: /* * Js Class Cookie * Author:Mr Co */ var Cookie = function(/*Cookie名称*/name){ this.$name = name; var allcookies = [removed]; if(allcookies == ”) return; ...

    揭开十大网站分析神话真相

    本文将深入探讨并揭示网络分析领域内广为流传的十大神话,这些神话往往误导企业和营销人员对网站分析的理解和应用。我们将逐一剖析这些神话,并提出基于现实的可行建议,帮助读者更好地理解网站分析的真谛,从而促进...

    QQ邮箱空间收信教程和工具

    “ip.asp”和“qq.asp”可能是与QQ邮箱相关的网页源代码文件,可能用于学习和分析QQ邮箱的网页结构和交互逻辑,对于开发者来说,这些文件能提供一些关于网页版邮箱工作原理的见解。 “QQWry.Dat”文件通常包含IP...

    online_judge:基于NodeJs的平台允许您以各种编程语言编译和运行代码。 可以使用适当的过滤器过滤掉不同的问题,并根据不同的难度级别和标签来练习不同的编程问题。 它使用饼图为用户提供有关以前提交内容的性能的直观见解

    它使用饼图为用户提供关于他/她先前提交的表现的直观见解。 用户可以结交朋友并关注全球各地的其他编码人员。 您可以通过聊天窗口与您的朋友进行讨论。 根据您以前的表现,甚至可以上传自己的问题或举办比赛供其他...

    blog 博客网站 实例

    博客网站是一种在线平台,用于个人或团队发布、分享和交流思想、见解或信息。在这个"blog 博客网站"实例中,我们可能涉及到以下几个重要的IT知识点: 1. **博客平台架构**:博客网站通常由前端界面和后端服务器组成...

    英文版清晰有目录pdf版本的 Building Scalable Apps with Redis and Node.js

    本书不仅介绍了如何使用Node.js和Redis构建应用程序的基础和高级功能,还提供了一些进阶主题的探讨,比如如何使用Redis作为Socket.IO的存储后端,这有助于提升大规模应用的性能和可扩展性。作者对于如何将这些技术与...

    PollBuddy:Poll Buddy是一个交互式调查表平台,旨在成为一种有趣且易于使用的方式来从一群人中收集答案和见解

    Poll Buddy是一个交互式调查表平台,旨在成为一种有趣且易于使用的方式来从一群人中收集答案和见解。 RCOS / Google云端硬盘项目(建议书,其他项目资源): : 站点地图: : 。 联系PM以进行编辑访问。 如何运行...

    阿里面试题总结

    - **准备建议**:准备一些技术案例,能够流畅地讲解技术细节,并能够在讨论中提出自己的见解。 ### 四、个人素质 - **评估内容**:主动学习的态度、对技术的兴趣度、阅读习惯及解决问题的能力。 - **准备策略**:...

    关于同一用户不能同时登录文件下载

    4. **分布式会话存储**:在分布式环境中,可以使用如Redis或Memcached等缓存服务存储会话信息,确保全局范围内对会话的统一管理。 5. **前端提示**:在前端页面添加提示信息,告知用户账户已在其他地方登录,以便...

    Web前端黑客技术揭秘

     web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含web 前端安全的跨站脚本(xss)、跨站请求伪造(csrf)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、cookie安全、flash 安全、dom ...

    web前端黑客技术揭秘

    Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...

    WEB前端黑客技术揭秘.pdf

    Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...

    Web前端黑客技术解密

    Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...

    WebQian Duan Hei Ke Ji Zhu Jie Mi - Zhong Chen Ming , Xu Shao Pei.mobi

    Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...

    Android Zirco浏览器源码.zip

    最后,源码中的注释和文档(如"源码说明.txt")是理解代码逻辑的重要辅助,它们提供了开发者对代码意图的直接见解,有助于快速理解和修改代码。同时,"双击访问白杨工作室查看更多程序源码~.url"可能指向更多开源...

    很使用的个人博客源代码

    在IT领域,个人博客已经成为许多技术爱好者、作家以及专业人士分享见解、记录成长历程的重要平台。"很使用的个人博客源代码"是一个完整的博客系统开发资源,它涵盖了从用户交互到后台管理的一系列功能,为自建个性化...

    生产实习 设计文档1

    在这个生产实习的设计文档中,项目主要关注的...这个项目综合运用了数据采集、自然语言处理、数据分析和数据可视化等技能,对于理解疫情前后大学生的线上学习情况提供了深入的见解,也为未来线上教学的改进提供了依据。

    qq空间转发说说软件 海棠QQ空间小号批量转发说说软件 v1.0

    QQ空间是中国最受欢迎的社交平台之一,用户们常常在上面发布说说来分享心情、见解或信息。"qq空间转发说说软件 海棠QQ空间小号批量转发说说软件 v1.0" 是一个专为QQ空间设计的工具,旨在帮助用户更便捷地管理多个QQ...

Global site tag (gtag.js) - Google Analytics