`
conkeyn
  • 浏览: 1540454 次
  • 性别: 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  
谢谢,楼主,楼主的文章将被载入史册~!~~~~

相关推荐

    cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击.zip_js设置cookie值

    当一个Cookie被设置为HttpOnly时,JavaScript无法通过Document.cookie API或其他方式访问到这个Cookie。这样一来,即使网页中存在XSS漏洞,恶意脚本也无法窃取到包含敏感信息的Cookie,从而降低了攻击者盗取用户身份...

    javascript cookie

    这个文件包含了javascript对浏览器cookie文件的设置、读、写、删除四个函数,非常好用。

    IE cookie编辑器

    3. **安全性**:由于Cookie可以被恶意利用,例如进行跨站脚本攻击(XSS),因此开发者需要谨慎处理Cookie的设置,包括设置HttpOnly属性以防止JavaScript访问,以及Secure属性确保只通过HTTPS协议传输。 **使用IE ...

    C#和javascript操作cookie

    在ASP.NET环境中,结合C#和JavaScript,我们可以实现跨语言的Cookie操作,以便于实现用户会话管理、个性化设置等功能。本文将详细探讨如何在C#后端和JavaScript前端中操作Cookie。 首先,C#在ASP.NET中处理Cookie...

    cookie-banner, 基于JavaScript的cookie信息横幅,适用于欧盟 cookie.zip

    cookie-banner, 基于JavaScript的cookie信息横幅,适用于欧盟 cookie Cookie标题 Cookie横幅是确保你遵守欧盟Cookie规则的一种非常简单的方法。 只要从你的页面引用 cookiebanner.min.js 脚本就完成了。Cookie ...

    cookiejs一个用于处理浏览器cookie的简单轻量级JavaScriptAPI

    Cookie.js是一个专为JavaScript开发者设计的轻量级库,主要用于管理和操作浏览器中的cookie。这个库的主要优点是它的简洁性和低资源占用,使得它成为处理cookie的理想选择,尤其适用于那些对性能和加载速度有较高...

    javascript 操作cookie.js

    javascript 操作cookiejavascript 操作cookiejavascript 操作cookie

    javascript 获取cookie

    通过函数获取JavaScript cookie

    jquery 设置cookie、删除cookie、获取cookie

    // 设置特定域名下的 Cookie $.cookie('name', 'dumplings', { domain: 'qq.com' }); // 设置特定路径下的 Cookie $.cookie('name', 'dumplings', { domain: 'qq.com', path: '/' }); ``` #### 四、获取 Cookie ...

    cookie设置httpOnly和secure属性实现及问题

    ### Cookie设置httpOnly和secure属性实现及问题 #### 一、引言 在现代Web开发中,保护用户的隐私和数据安全至关重要。其中一种常见的做法就是通过设置Cookie的`httpOnly`和`secure`属性来增强安全性。这两个属性...

    cookie--javascript记录用户之前是否访问本页面

    7. **HTTPOnly**:如果设置,防止JavaScript通过`document.cookie`属性访问该Cookie,增加安全性。 JavaScript中操作Cookie的方法主要有: 1. **创建Cookie**:使用`document.cookie`属性设置一个包含所有属性的...

    ie不执行javascript修复

    ie不执行javascript修复ie不执行javascript修复ie不执行javascript修复 当IE不能正常运行时,打开该工具就可以了,自动修复

    JavaScript环境中网络课程开发之cookie技术应用研究.pdf

    JavaScript可以通过设置document.cookie的属性值来保存Cookie,并可以通过读取Cookie来获取保存的信息。 六、结论 本文详细讨论了Cookie技术在JavaScript环境中的应用,包括Cookie的定义、Cookie的保存方式、利用...

    IE8的JavaScript点击事件(onclick)不兼容的解决方法

    在标准模式下,IE8及以下版本不支持通过`setAttribute`直接为元素添加事件监听器,这与现代浏览器如Chrome和Firefox存在差异。为了确保兼容性,通常推荐使用`addEventListener`方法为元素添加事件监听器,但由于IE8...

    IIS环境下和阿帕奇环境下 js的Cookie使用方法

    这篇教程将深入探讨在IIS(Internet Information Services)和Apache两种不同的Web服务器环境下,如何使用JavaScript来操作Cookie。 **一、Cookie的基本概念** Cookie是由服务器端创建,并发送到客户端浏览器的一...

    javascript 中Cookie读、写与删除操作.docx

    在JavaScript中,可以通过`document.cookie`属性来设置Cookie。基本格式如下: ```javascript document.cookie = "name=value; expires=expiration_date; path=path; domain=domain; secure"; ``` - `name`: ...

    兼容多种IE的javascript日期控件

    "兼容多种IE的javascript日期控件"这个主题就是针对这个问题的一个解决方案。它是一个经过改造的calendar日期控件,旨在确保在不同版本的Internet Explorer(如IE6、IE8、IE9)中能够正常运行,尽管在Google浏览器中...

    JavaScript Cookie显示用户上次访问的时间和次数

    在代码中,可以设置一个 JavaScript 的 Date 对象,并使用 toGMTString() 方法来将其转换成 GMT 格式的字符串,用于设置 expires 参数。 知识点四:使用 JavaScript 显示访问次数和时间 要显示用户的访问次数和上次...

    【JavaScript源代码】详解操作cookie的原生方法cookieStore.docx

    JavaScript中的Cookie管理和操作是Web开发中的基础技能,用于存储客户端数据。传统的操作方式主要依赖于`document.cookie`属性,但这种方式存在一些限制,比如字符长度限制、无法直接操作多个Cookie等。随着浏览器...

    cookie通信_javascript_

    - Cookie大小限制:每个Cookie的大小不超过4KB,且每个域名下的Cookie数量有限制,一般为20个。 - 安全性:Cookie数据是明文传输的,因此不应存储敏感信息。为了增强安全性,可以使用HTTPS协议传输,并设置`secure`...

Global site tag (gtag.js) - Google Analytics