`
conkeyn
  • 浏览: 1505573 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

IE下javascript cookie path设置Bug

阅读更多

手上一个广告项目,在Firefox下顺利测试通过。自信JS代码能兼容IE,FF测试过后随手就仍给CS测试,结果CS反馈说有问题。排查一番, 发现居然和Javascript 设置 Cookie 时的 path 有关。IE下Cookie种在 /或者URL所在路径时正常,如果Cookie值作用域在当前URL下则IE下javascript 无法获取到设置的Cookie值。

看下面演示代码:

 

var cookie_name = "name";
var cookie_value = "value";
expires = new Date();
expires.setTime(expires.getTime() + 86400 * 1000);

// 有Bug document.cookie无法独到cookie_name值
document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)
		+ "; expires=" + expires.toGMTString() + "; path="
		+ window.location.pathname;
// 正常
document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)
		+ "; expires=" + expires.toGMTString() + "; path=/test/";
// 正常
document.cookie = "cookie_name=" + encodeURIComponent(cookie_value)
		+ "; expires=" + expires.toGMTString() + "; path=/";

 

怀疑是IE的Bug、
在google上 搜了下关键词: ie javascript cookie path bug
同样的问题在罪与罚 的博客上也有描述,而且博主联系过微软IEBLOG 的Eric。得到的回复是:

You have uncovered an IE bug where cookies that are set with a path that contains a filename (e.g. /page.htm) are not accessible to the document.cookie function, although they are correctly sent to the server in the HTTP header. This has been broken for at least 10 years and unfortunately probably will not be fixed in IE8.

Thanks,

-Eric

一个存在10年的Bug。。。而且IE8也不会修复,实在是无语。

需求是cookie值只对当前页面有效,没办法只好用替代方案,看代码:

 

//IE Cookie Bug 替代方案
var cookie_path = window.location.pathname;
var cookie_name = encodeURIComponent(cookie_path.substring(cookie_path
		.lastIndexOf('/') + 1));
cookie_path = cookie_path.substring(0, cookie_path.lastIndexOf('/') + 1);
var cookie_value = "value";
expires = new Date();
expires.setTime(expires.getTime() + 86400 * 1000);

document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)
		+ "; expires=" + expires.toGMTString() + "; path=" + cookie_path;

 替代方案根据每个页面的URL文件名来做Cookie名,有效范围在当前页路经下。
如:url 等于 /test/test.html
则cookie名为test.html,有效路径为/test/
这样也可以做到同一个js部署在每个页面上能读到只对当前URL有效的cookie值。代价是当用户在同一级目录下访问很多页面时会导致cookie值不 断增大。结果是当前路径下的每个http请求都带很长一段的cookie,直接导致服务器接收客户端request的header长度增长,流量增长的同 时服务器负担也变重。而且根据 RFC 2109 的定义Cookie也有长度和个数限制,IE允许的最大 Cookie 长度是 4096 字节,允许50个 Cookie 名-值对。如果要突破50个名-值对的限制,可以在一个名-值使用Cookie字典的方式保存更多的Cookie变量。

 

 

http://blog.seateng.cn/archives/2009/03/ie-javascript-cookie-path-bug.html

 

分享到:
评论
4 楼 showrock 2010-07-04  
牛。。。。
3 楼 mfkdzhou 2009-12-01  
我现在也遇到这个问题啊。。。最恶心的是我现在不支持 path=/ 我用的IE6 楼主有解决方案不?
2 楼 kaipingk 2009-11-05  
我这几天也遇到这个问题! IE真烂啊。。。。
1 楼 dfx306956205 2009-10-15  
谢谢,楼主,楼主的文章将被载入史册~!~~~~

相关推荐

Global site tag (gtag.js) - Google Analytics