情况:
我有一个Javascript / jQuery Web应用程序,它与PHP / MySQL / Zend Framework 1.12后端通信。 Web应用程序在iFrame内部运行(在iframe模式下加载jQuery fancybox)。
应用程序在后端创建一个对象,并使用它保存当前的会话ID。然后,它在前端显示对象的属性,并在用户与应用程序交互时通过ajax调用修改后端上的对象。会话ID用于检查ajax请求是否来自同一用户(用户未登录,因此这是检查的唯一方法)。
我使用jQuery来执行ajax调用,使用Zend_Session来处理PHP / Zend中的会话。
问题:
现在,问题是在safari 6中,这些ajax请求具有不同的会话ID,因此它们与存储在后端模型对象中的会话ID不匹配,并且访问被拒绝。
只有在iframe中运行时才会发生这种情况,而不是在任何其他浏览器上运行,而不是在其他版本的safari(5或更低版本)上运行
有没有人知道是什么导致这种情况以及如何处理它?</ p>
更多信息:
整个应用程序在iframe中运行,iframe也是在后端模型中存储会话ID的调用。所以我认为所有这些调用具有相同的会话ID。
另一件事:一旦我在一个单独的选项卡中运行应用程序,然后再次在iframe中,问题就会消失:从那时起直到我杀死浏览器会话,我每次都会得到相同的会话ID。坦白说,那对我来说闻起来像个臭虫。
答案 0 :(得分:1)
关键问题是iFrame。作为Safari安全模型的一部分,在iFrame中运行的请求将与其余页面请求分开处理。这是他们第三方cookie保护的一部分。据我了解,Firefox22将开始做同样的事情,但不是那么严格。
如果你确定你真的想要解决这个问题,请将PHP的会话ID cookie输出并将其放在查询字符串上以获取对iFrame的请求。然后,您可以从查询字符串中提取会话ID并使用该字符串。 (如果你这样做,你不会在cookie数据中得到一个。)