【问题标题】:How to solve this weird cross domain issue?如何解决这个奇怪的跨域问题?
【发布时间】:2011-11-17 06:51:16
【问题描述】:

基本上,我的应用程序位于社交网络中,在我的应用程序页面中,他们创建了一个 iframe,其(不是我的)URL 指向 “renderer”,然后使用(不要问如何)我的代码(html, js) 并放置在此 iframe 的 body 标记中。

由于我需要能够运行 iframe 的 JavaScript 函数,我决定不使用我的应用程序 URL 创建另一个 iframe,而是使用 ajax 调用将我的应用程序的内容加载到其 iframe 的正文中。这样我就可以运行他们的 JavaScript 函数。如果我要在他们的 iframe 中创建我的 iframe,那么由于跨域的东西我无法运行它们,对吧?

但是,当我使用 jQuery 对我的应用程序执行 ajax 调用时,它们是从社交网络执行的(因为 iframe 是他们的,只是我的正文代码),因此保存在我的应用程序域中的会话 cookie 对 ajax 不可用来自这个 iframe 的调用。

我认为我需要在社交网络的 iframe 中创建一个 iframe (dooh),但是如何克服跨域问题以访问父 iframe 中的 JavaScript 函数?

P.S. 抱歉,解释太长了。想给大家讲清楚。

【问题讨论】:

  • 如果您尝试使用 AJAX 获取正文内容的 URL 位于另一个域中,恐怕由于跨域策略,这是不可能的
  • 好的,这很清楚。那么是否有可能以某种方式克服跨域策略来调用父 iframe 函数?我有限(但仍然)控制了父 iframe。

标签: javascript cookies iframe cross-domain


【解决方案1】:

无法从其他域读取 cookie。

AJAX 失败是因为您正在使用 XHR 并且您被 Same Origin Policy 阻止。或者,您使用的是 JSONP,但未设置 cookie。

如果您使用 XHR,请切换到 JSONP

使用 JSONP,您将无法设置 cookie。 JSONP 只是通过设置脚本标签的 src 来加载脚本,而 cookie 不能这样设置(别说不能从其他域设置)。

您必须通过在每个 JSONP 请求中传递会话 ID 来手动管理状态。

【讨论】:

  • 嗯,关于我自己管理会话的要点非常好。既然你这么说,我查找了 PHP 参考,session_id() 可用于设置会话 ID!我可以将会话 ID 传递给 JavaScript 端,然后下次将它返回给 PHP 端以继续它。值得一试!
  • 感谢上帝!它现在完美运行!传递 session_id 是不是很不安全?