2013年4月26日

cookie的妙用


故事是这样的。今天天朗气清,惠风和畅,PM2.5也没再创新高了,实在是一个踏青看妹纸的大好天 气。但是今天既不是法定节假日,也不是属于我的婚假、产假、年假、生理假等任何一种,也因为常吃板蓝根炒饭,所以对那个H*N*也不甚在意。所以我得起床 去上班,风雨无阻的去上班。

到公司屁股还没坐热,我就看见我公司邮箱的小图标亮了,每当这个时候我就会有点小激动,因为这表示有人在惦记我,通过光纤,越过大西洋传递给我亲切 的话语。即便我常常在抄送的名单里,但每次当图标一亮我都迫不及待的想要去打开它,就像我迫不及待的想知道电影的结局一样。点开一看,心头一凉,我发现是 我最不喜欢那类邮件,不是关你屁事的抄送,也不是治肾亏梅毒或者只要998的小广告,更不是空虚寂寞冷的亲切慰问。而是我可爱可敬可歌可叹的QA童鞋给我 提交的bug。每当这个时候技术宅肯定会满血复活,查克拉在燃烧,生活突然有了意义,真爱会有的等等正能量。但是我没有,我只能在关闭女神图之前多看两 眼,然后点开了bug链接。

这是一个代号为AD-10791的bug。大概是这个意思:当用户登录了某网站以后,同时保持着该网站的两个页面,现在在其中一个页面退出账号后,另外一个页面就需要知道你的身份没有了,你不能这么干。就是这样一个情况。

我大呼一声,“靠”。还好这个问题我还是有经验的。你知道浏览器tab页之间是不能共享数据的。所以这类任务只能向后台询问,大不了在另外一个页面 发请求的时候,后台判断后返回给我一个未登录的code,我告诉用户你傻呀,你都退出了,还不滚。思路就是这样。以前做人人逛街的时候却也是采用的这种方 案。但是这明显不牛逼呀,以后出去怎么跟别人打招呼呀?有没有不用刷新页面,不用像后台询问就能知道用户从另外一个页面退出了呢?带着这个问题我看了网站 另外一个需要用户登录才能使用的功能。我当时想,切,肯定还是一样的解决思路。可是我发现,居然没发请求!发请求!请求!求!没有通过后台就判断出来用户 从另外一个页面退出了。我立马震惊了。等情绪down下来的时候,我决定找出他的实现方案,这是我作为技术宅的使命。

等真相水落石出的那一刻,我又震惊了。我怎么就没想到呢。谁说浏览器页面之间不能共享数据了,用cookie呀。某315晚会还专门给我提示了,靠,我都忘了,感觉不会再爱了。

cookie指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109(已废弃),最新取代的规范是RFC2965。

所以网站的cookie是在该网站的任何子页面里都能进行访问并设置的。通过document.cookie就能取到该网站的所有cookie(全兼容额亲)。下面就是那段敲打我不开窍脑袋的代码:

var checkLogin = function() {
if (XN.Cookie.get(‘t’) != null) {
return true;
} else {
XN.DO.confirm({
title: ‘未登录’,
message: ‘您需要登录才能进行此操作,现在登录吗?’,
width: 500,
modal: true,
callBack: function(flag) {
if (flag) {
window.location.href = “http://leechan.me”;
}
}
});
return false;
}
}

所以,在用户退出的时候把cookie中表示登录状态的字段进行修改。像上面我们的代码时用一个叫t的字段保存的。这样你就可以很方便的判断用户的登录状态。

document.cookie返回的是一个字符串,所以为了方便我们需要做一个解析处理。

var cookieParse = function(cookie) {
var mapping = {},
cks = cookie.split(‘;’);
for(var i = 0, l = cks.length; i < l; i++) {
var ck = cks[i].replace(/^s+|s+$/g, ”),
cp = ck.split(‘=’);
mapping[cp[0]] = cp[1];
}
return mapping;
}

这样我们就能方便取到我们想要的cookie字段了。

问题来了。
1.用户可以禁用cookie
2.用户可以修改cookie

如果你在做一个要求非常严格的网站,使用cookie的时候就需要考虑到以上问题,并给出对应的解决方案。但是如果只是一般的网站,其实完全可以不 用担心这两个问题,对于禁用cookie,可以通过navigator.cookieEnabled去判断检测,并采取对应方案。其实没有一个百分百无漏 洞的产品,一个趋于0 bug的产品并非就是一个好产品,只能说明你有一个好态度。所以大部分时候我是不考虑cookie的上述两个问题的,感觉实在不必要。

当然我在写程序的过程中还是追求稳定,少出问题,Don’t make users fuck! 其实我也有一个好态度。

标签:

微信扫一扫二维码访问


16年前端经验
加微信好友直接沟通
了解《我的十年》