1

情况:

我有一个与 PHP/MySQL/Zend Framework 1.12 后端通信的 Javascript/jQuery Web 应用程序。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,正如我所期望的那样。坦率地说,这对我来说就像一个错误。

4

1 回答 1

1

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

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

于 2013-02-28T18:03:48.663 回答