Internet Explorer 8 不会为 ajax 请求传递会话 cookie
Posted
技术标签:
【中文标题】Internet Explorer 8 不会为 ajax 请求传递会话 cookie【英文标题】:Internet Explorer 8 doesn't pass session cookie for ajax request 【发布时间】:2010-10-03 18:19:37 【问题描述】:我有一个简单的 php 应用程序,它适用于除 IE8 beta 2 之外的所有浏览器,当我尝试使用 Ajax 调用(jQuery post 方法)更新表字段时出现问题。使用 IE8 调试器我发现 IE8 不发送会话 cookie,因此 php 脚本重定向到登录页面而不是执行请求的操作。
我能做些什么来完成这项工作。
编辑: 我没有提到我正在使用 Code Igniter,所以我通过将 Code Igniter 默认会话实现替换为原生会话实现来解决了这个问题。代码点火器默认会话实现使用 cookie 来存储所有数据。
【问题讨论】:
IE 8 是否在正常请求时发送 cookie? 在正常请求下工作正常,但在 ajax 请求后它会清除 cookie。 CodeIgniter 的 Session 实现很烂 【参考方案1】:昨天我遇到了类似的问题并找到了解决方案。我希望这对其他人也有帮助。
问题:假设有一个网站 www.somewebsite.com 和其中的 IFRAME 从我的服务器加载 php 文件 www.myserver.com/welcome .php。网站和我的欢迎页面都加载成功,它显示了类似“Hello Bob”的内容,因此它成功找到了用户并让他登录。
之后我的 javascript 对另一个 PHP 文件进行 AJAX 调用,响应处于“未授权”状态,因此 SESSION 数据完全丢失。页面刷新后,一切正常。而且这种情况只发生在 IE8 下!
我认为问题在于将会话 cookie 发送到服务器,但是当我安装 Fiddler 时,我发现 IE8 正在正确发送 cookie 以及 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等
【讨论】:
这是我未发送 cookie 的非框架 jsonp 跨域请求的解决方案。谢谢!【参考方案2】:我自己没有 IE8,但 Internet Explorer 奇怪的安全策略可能会阻止您的 cookie。一种可能的解决方法是使用P3P(这也是让 cookie 在 IFRAME 中工作的方法)。
生成正确的 P3P 策略可能需要一些工作,但您应该能够在 http://www.p3ptoolbox.org/ 找到所需的信息
【讨论】:
【参考方案3】:我在 IE8 RC1 中遇到了同样的问题:
1) 用户进入登录页面并设置了空白会话 cookie 2)用户登录并设置了一个经过验证的会话cookie,javascript打开一个新窗口并关闭当前窗口。 3) 新窗口打开并包含一个空白会话 cookie。 4)用户被重定向到登录页面
我更改了第 1 步,因此未设置空白 cookie - 如果会话 cookie 得到验证,我只会发送它。这解决了我的问题。
【讨论】:
【参考方案4】:我无法让 IE8 使用 SSL 证书 (PK12) 文件作为授权方式。如果我想保护目录并在授予访问权限之前强制在浏览器中显示匹配的 Web 证书。它适用于 IE7 和所有版本的 Mozilla - 只是不适用于 IE8。它使我妻子的听写系统毫无用处。我注意到的另一件事是,当它设置 PHPSESSID cookie 时,它将域列为 .net 而不是 mydomain.net。
【讨论】:
【参考方案5】:作为一种解决方法,您可以将 SessionID 作为参数嵌入到 uri 中。
请参阅 php 手册中的passing session id。
【讨论】:
以上是关于Internet Explorer 8 不会为 ajax 请求传递会话 cookie的主要内容,如果未能解决你的问题,请参考以下文章
为 Internet Explorer 8 禁用 jQuery 中的缓存问题
在同一台计算机上运行 Internet Explorer 6、Internet Explorer 7 和 Internet Explorer 8
Windows Internet Explorer 8 是啥
PHP:如果 Internet Explorer 6、7、8 或 9
从 Internet Explorer 8 打印时,我需要为不透明度设置哪种 css 样式?
为啥即使在模拟 Internet Explorer 8 文档模式时,Internet Explorer 11 也不支持条件注释?