Internet Explorer 8在ajax请求中不传递会话cookie

6
我有一个简单的php应用程序,它在除IE8 beta 2之外的所有浏览器上都可以正常工作。当我尝试使用Ajax调用(jQuery post方法)更新表字段时出现问题。使用IE8调试器,我发现IE8没有发送会话cookie,因此php脚本重定向到登录页面而不是执行请求的操作。
我该怎么做才能使其正常工作呢?
编辑:我没有提到我正在使用Code Igniter,所以我通过将Code Igniter默认会话实现替换为本机实现来解决了这个问题。Code igniter默认会话实现使用cookie存储所有数据。

IE 8在普通请求中发送cookie吗? - Gumbo
正常请求可以正常工作,但在 Ajax 请求后会清除 cookie。 - Edin Omeragic
1
CodeIgniter的Session实现很糟糕。 - Ionuț G. Stan
5个回答

9
昨天我遇到了类似的问题并找到了解决方法。希望这能帮助其他人。

问题:假设有一个网站www.somewebsite.com,其中包含一个IFRAME,从我的服务器www.myserver.com/welcome.php加载php文件。网站成功加载,我的欢迎页面也成功显示了“Hello Bob”,所以它成功地找到了用户并登录了他。

然后我的JavaScript正在调用另一个PHP文件进行AJAX调用,响应状态是“未经授权”,因此SESSION数据完全丢失。刷新页面后,一切都正常工作。而这只在IE8下出现过!

我认为问题出在将会话cookie发送到服务器上,但当我安装Fiddler时,我发现IE8正确地发送了cookies和PHPSESSID,但服务器无法检测到正确的SESSION对象。另一个奇怪的事情是,第二次服务器发送以下标头:

P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"

但第一次不行。在PHP脚本中手动添加该标头后,一切都像魔术般地正常工作了!

然后,当我谷歌搜索“p3p abracadabra”时,我发现了以下网站:

http://adamyoung.net/IE-Blocking-iFrame-Cookies

结论:确保在设置cookie的每个页面上都发送头文件。
这不仅与IE8 + PHP组合有关,同样的问题也会发生在IE8 + ASP.NET、IE8 + JSP等情况下。

这是我非框架的跨域请求中JSONP不发送cookie的解决方案。谢谢! - changokun

6
我自己没有IE8,但是你的cookie可能被Internet Explorer奇怪的安全策略阻止了。一种可能的解决方法是使用P3P(这也是在IFRAME内使cookie工作的方法)。
生成正确的P3P策略可能需要一些工作,但是你应该能够在http://www.p3ptoolbox.org/找到所需的信息。

0

我在IE8 RC1中遇到了同样的问题:

1)用户进入登录页面,并设置一个空的会话cookie
2)用户登录成功,已验证的会话cookie被设置,JavaScript打开了一个新窗口并关闭了当前窗口。
3)新窗口打开了,但包含一个空的会话cookie。
4)用户被重定向到登录页面

我将步骤1更改为不设置空cookie-只有在会话cookie经过验证后才发送。这个方法解决了我的问题。


0

我遇到了一些麻烦,无法让IE8使用SSL证书(PK12)文件作为授权手段。如果我想保护一个目录并强制要求匹配的Web证书在授予访问权限之前存在于浏览器中。它可以在IE7和所有版本的Mozilla上正常工作-但在IE8上不能。这使得我妻子的口述系统无用了。另外我注意到的一件事是,当它设置PHPSESSID cookie时,它将域列为.net而不是mydomain.net。


-3

作为解决方法,您可以将SessionID作为uri参数嵌入其中。

请参见PHP手册中的传递会话ID


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接