【问题标题】:Safari 6 ajax requests get new session idSafari 6 ajax 请求获取新的会话 ID
【发布时间】:2013-02-28 17:45:15
【问题描述】:

情况:

我有一个与 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,正如我所期望的那样。坦率地说,这对我来说就像一个错误。

【问题讨论】:

  • 我在 6 版的 Safari Extensions 中也遇到了这个问题。还没有设法解决它。
  • 我认为这似乎是 Safari 中的一个错误,如果是这种情况,解决这个问题可能完全不可能......

标签: php javascript zend-framework session safari


【解决方案1】:

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

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

【讨论】:

  • 整个应用程序运行在 iframe 中,会话 id 的调用也存储在后端模型中。所以我认为所有这些电话都是同一个会话。另一件事:一旦我在单独的选项卡中运行应用程序,然后再次在 iframe 中运行,问题就消失了:从那时起,直到我终止浏览器会话,我每次都得到相同的会话 ID,正如我所期望的那样。
  • 如果确实是他们的政策导致了这种情况,无论我是否在单独的选项卡中打开应用程序一次,我都应该得到这种行为。
  • Safari 在检测正在发生的事情方面比您想象的要聪明得多。 :) 这是另一个带有 PHP 解决方法的 Stack Exchange 答案:stackoverflow.com/questions/9930671/…
猜你喜欢
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2020-05-25
  • 2016-05-05
  • 2014-04-03
  • 2017-02-23
相关资源
最近更新 更多