IE对Cookie的path处理

转自:http://www.mzone.cc/article/363.html

 

      昨天在部署系统时发现一个看来很奇怪的问题,就是在google浏览器Chrome和Firefox下都运行的非常正常,但在IE内核的浏览器中总是有一个cookie无法取到的问题。无意间google下发现网上有很多针对IE8的cookie丢失的问题讨论,就想是不是IE8的cookie处理机制导致的,其实后来发现不是,算是走了弯路。因为本地运行正常并且是IE中都跑的蛮ok的,一到服务器上就出现了问题,具体的情形是我在网页中有一段类似如下的脚本引用:

<script language="javascript" src="http://abc.mydomain.com/p1/check"></script>

 

      这段脚本就是向服务器abc.mydomain.com请求一段js,按理来说请求这段js时浏览器应该同时附带该域下的cookie到服务器上,服务器程序会解析到cookie并返回对应的信息,我出现的问题就是IE中根本就不发送cookie到服务器。而之前设置cookie的java代码类似如下:

Cookie cookie = new Cookie("name", "value");
cookie.setMaxAge(-1);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);

 

      这段脚本看起来没有什么错误,确实是在本地测试时一切正常。其实这个最大的问题就是setPath这条语句了,因为我这里是动态获取应用程序的上下文路径作为cookie的根路径,在本地测试时由于都有contentpath,所以不会有什么问题。但一旦部署到服务器后由于是独立域名部署根contextpath,所以取到的contextpath是空串,可惜的是IE对如下的cookie路径设置和chrome和firefox是完全不一样的:

cookie.setPath("");

 

      实践证明IE会忽略这个path,而chrome和firefox则会认为是设置了。因为根据cookie规范,如果设置了path,那么只有当访问路径中包含了这个path的url时才会发送cookie到服务器;如果没有设置path,那么只有当访问和设置cookie同样的路径时才会发送cookie到服务器。可惜的是这里IE忽略了,因此会按照后面的来处理cookie,而chrome和firefox则会认为设置了path,那么理所当然的任何访问路径都会携带cookie,这也就导致了我前面所说的情况了。

PS:cookie规范文档请查看这里:http://curl.haxx.se/rfc/cookie_spec.html

猜你喜欢

转载自12180062.iteye.com/blog/2269289
今日推荐