2013-02-28 76 views
1

现状:的Safari 6的Ajax请求得到新的会话ID

我有一个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以下)

有没有人有一个想法是什么原因,以及如何对付它只是发生?

一些更多的信息:在iframe

整个应用程序运行时,从该会话ID存储在后端模式以及呼叫。所以我认为所有这些电话都有相同的会话ID。另一件事:一旦我在单独的选项卡中运行应用程序,然后再次在iframe中,问题就会消失:从那时起,直到我终止浏览器会话,我每次都会获得相同的会话ID,正如我所期望的那样。坦率地说,这听起来像是一个错误。

+0

我在6年的Safari扩展中也遇到了这个问题。还没有设法绕过它。 – Alfo 2013-02-28 17:49:34

+0

似乎是Safari中的一个错误,我认为,如果是这种情况,可能不太可能解决这个问题...... – Asciiom 2013-02-28 17:57:55

回答

1

关键问题是iFrame。作为Safari安全模型的一部分,运行在iFrame中的请求将与其余的页面请求分开处理。这是他们的第三方cookie保护的一部分。据我了解,Firefox22将开始做同样的事情,但没有那么严格。

如果您确定您确实想要解决这个问题,请将PHP的会话Id cookie取出并将其放在查询字符串中,以请求iFrame。然后,您可以从查询字符串中提取会话ID并使用该ID。 (如果你这样做,你将不会在cookie数据中出现一个)。

+0

整个应用程序运行在iframe中,会话ID存储在后端模型中太。所以我认为所有这些电话都是同一个会话。另一件事:一旦我在单独的选项卡中运行应用程序,然后再次在iframe中,问题就会消失:从那时起,直到我终止浏览器会话时,我每次都会得到相同的会话ID,就像我期望的那样。 – Asciiom 2013-02-28 18:10:17

+0

如果确实是他们的政策造成这种情况,无论我在一个单独的选项卡中打开应用程序,我都应该得到该行为。 – Asciiom 2013-02-28 18:14:40

+0

Safari在检测发生的事情方面正在变得更聪明,而不是让您称赞它。:) 这是另一个与Exchange解决方案的Stack Exchange答案:http://stackoverflow.com/questions/9930671/safari-3rd-party-cookie-iframe-trick-no-longer-working – 2013-03-01 14:39:57

相关问题