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 Class Cookie * Author:Mr Co */ var Cookie = function(/*Cookie名称*/name){ this.$name = name; var allcookies = [removed]; if(allcookies == ”) return; ...
本文将深入探讨并揭示网络分析领域内广为流传的十大神话,这些神话往往误导企业和营销人员对网站分析的理解和应用。我们将逐一剖析这些神话,并提出基于现实的可行建议,帮助读者更好地理解网站分析的真谛,从而促进...
“ip.asp”和“qq.asp”可能是与QQ邮箱相关的网页源代码文件,可能用于学习和分析QQ邮箱的网页结构和交互逻辑,对于开发者来说,这些文件能提供一些关于网页版邮箱工作原理的见解。 “QQWry.Dat”文件通常包含IP...
它使用饼图为用户提供关于他/她先前提交的表现的直观见解。 用户可以结交朋友并关注全球各地的其他编码人员。 您可以通过聊天窗口与您的朋友进行讨论。 根据您以前的表现,甚至可以上传自己的问题或举办比赛供其他...
博客网站是一种在线平台,用于个人或团队发布、分享和交流思想、见解或信息。在这个"blog 博客网站"实例中,我们可能涉及到以下几个重要的IT知识点: 1. **博客平台架构**:博客网站通常由前端界面和后端服务器组成...
本书不仅介绍了如何使用Node.js和Redis构建应用程序的基础和高级功能,还提供了一些进阶主题的探讨,比如如何使用Redis作为Socket.IO的存储后端,这有助于提升大规模应用的性能和可扩展性。作者对于如何将这些技术与...
Poll Buddy是一个交互式调查表平台,旨在成为一种有趣且易于使用的方式来从一群人中收集答案和见解。 RCOS / Google云端硬盘项目(建议书,其他项目资源): : 站点地图: : 。 联系PM以进行编辑访问。 如何运行...
- **准备建议**:准备一些技术案例,能够流畅地讲解技术细节,并能够在讨论中提出自己的见解。 ### 四、个人素质 - **评估内容**:主动学习的态度、对技术的兴趣度、阅读习惯及解决问题的能力。 - **准备策略**:...
4. **分布式会话存储**:在分布式环境中,可以使用如Redis或Memcached等缓存服务存储会话信息,确保全局范围内对会话的统一管理。 5. **前端提示**:在前端页面添加提示信息,告知用户账户已在其他地方登录,以便...
web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含web 前端安全的跨站脚本(xss)、跨站请求伪造(csrf)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、cookie安全、flash 安全、dom ...
Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...
Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...
Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...
Web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、...
最后,源码中的注释和文档(如"源码说明.txt")是理解代码逻辑的重要辅助,它们提供了开发者对代码意图的直接见解,有助于快速理解和修改代码。同时,"双击访问白杨工作室查看更多程序源码~.url"可能指向更多开源...
在IT领域,个人博客已经成为许多技术爱好者、作家以及专业人士分享见解、记录成长历程的重要平台。"很使用的个人博客源代码"是一个完整的博客系统开发资源,它涵盖了从用户交互到后台管理的一系列功能,为自建个性化...
在这个生产实习的设计文档中,项目主要关注的...这个项目综合运用了数据采集、自然语言处理、数据分析和数据可视化等技能,对于理解疫情前后大学生的线上学习情况提供了深入的见解,也为未来线上教学的改进提供了依据。
QQ空间是中国最受欢迎的社交平台之一,用户们常常在上面发布说说来分享心情、见解或信息。"qq空间转发说说软件 海棠QQ空间小号批量转发说说软件 v1.0" 是一个专为QQ空间设计的工具,旨在帮助用户更便捷地管理多个QQ...