【问题标题】:Opening a new window that needs to make ajax calls to another domain打开一个需要对另一个域进行 ajax 调用的新窗口
【发布时间】:2014-04-27 05:38:43
【问题描述】:

背景 我们有两个 Web 应用程序托管在不同的子域上。 Application 1 是一个内部管理系统。 Application 2 是一个帮助台系统。

我们可以修改Application 1的源代码,但我们无权修改Application 2。

目标 在应用程序 1 中显示针对订单的链接,该链接将打开一个新窗口,其 URL 是应用程序 2 中工单的 URL。

我们的工作人员可以看到订单有针对它的帮助台票,只需单击订单上的链接即可查看票并回复它。

问题 无论我如何打开新窗口(window.open、target="_blank" 等),新窗口中的票证都无法将任何 ajax 请求返回到托管它的帮助台系统。

新窗口的 URL 是应用程序 2 的一部分。

在 Google 开发工具中,它告诉我“请求访问的框架具有“http”协议,正在访问的框架具有“https”协议。协议必须匹配。”即使我使用 _blank 打开它。

如果我手动访问完全相同的 URL,一切正常...但是当我需要它从链接中工作时,这无济于事。

有没有什么办法可以达到上述目的?

如果没有,我有什么办法可以打开一个与打开它的窗口“分离”的新窗口,从而不再适用同源策略?

编辑 2014-03-28 10:23 我根本无法访问 App2 的代码。我无法对 App2 进行任何更改。任何答案都必须考虑到这一点。

我正在尝试从我的应用程序 (App1) 打开一个新窗口,该窗口的目标 URL 是 App2 中的一个页面。然后,App2 中的那个页面需要能够使用 ajax 与 App2 的其他区域进行通信。这就是问题所在。因为 App1 打开了窗口,同源策略阻止该窗口发出 ajax 请求。

【问题讨论】:

  • 那个应用程序2,是帮助台系统吗?或者帮助台系统在另一个应用程序中?另外,我了解到您可以打开新窗口,问题是新窗口中的页面无法向帮助台系统发出成功的 AJAX 请求。我理解正确吗?
  • App2 是帮助台。此外,App2 上没有 SSL。是的,你理解正确。
  • @Quentin 这不是重复的,这是一个非常具体的问题,您链接的帖子中的任何答案都不能在这种情况下起作用,因为我无法访问 app2 的代码
  • 这没有意义。如果您从链接或脚本打开一个新窗口,那么该页面应该可以正常工作。这里还有其他事情发生。

标签: javascript ajax same-origin-policy


【解决方案1】:

我怀疑第二个(帮助台)应用程序上的 JavaScript 正在尝试通过 window.opener 访问第一个应用程序(这可能导致您看到的跨域错误)和随后的 JavaScript(通过 AJAX 获取内容)是然后不被执行。您可以通过在第二个应用程序中设置适当的断点来缩小范围。

如果这是原因,并且您无法修改帮助台应用程序的源,那么转到内部域中的 URL,然后 重定向 到帮助台如何?重定向应该导致window.opener 属性变为null(与手动输入 URL 相同)。

假设https://admin.mydomain.co.ukhttp://helpdesk.mydomain.co.uk,点击“Help Ticket”链接将转到内部应用程序中的 URL,例如https://admin.mydomain.co.uk/getHelp?ticketId,它将以 301 响应和适当的 Location: http://helpdesk.domain.uk/help/ticketId 标头进行响应,将用户带到实际的帮助台 URL。

【讨论】:

  • 打开一个空白窗口var wnd = window.open();然后自己重​​定向wnd.location = 'http://google.com';
  • 这是现场...帮助台应用程序正在尝试访问 window.opener。
【解决方案2】:

您可以使用代理服务器或iframe proxying

【讨论】:

  • 我无法改变 app2 的行为。
【解决方案3】:

使用以下网址 //app2.mydomain.co.uk 不带 http 或 https。

【讨论】:

    【解决方案4】:

    这不仅是跨域问题,还是协议问题: 如果没有此警告,您无法将 https 嵌入 http 页面。

    考虑在您的 App1 中使用 iframe:

    <iframe src="https://app2.mydomain.co.uk" ></iframe>
    

    或者也许您可以使用CORS 访问您的两个域之间的数据(但我认为这不是重点,您想要整个 App2 页面,不是吗?)

    编辑:通过重新阅读您的问题,我很确定两件事:

    • 您看的方向不对。你说 App2 不使用 SSL,当 Chrome 说“协议必须匹配”时,这显然是错误的
    • 这不是“附加”或“分离”问题。如果您在页面中放置链接(无论是否为空白),都可以毫无问题地加载新页面,也不会与参考页面链接。

    所以我的猜测是:您在没有 SSL(没有 https)的情况下调用 App2,但是在 App2 内部,涉及一些 https(当然是一些 ajax 查询)。所以问题来了:当你打开没有 https 的页面时,它似乎可以加载,但是当第一个 https Ajax 触发时,它会失败。

    在调用您的 App2 url 时尝试使用 https,并将结果提供给我们

    【讨论】:

    • App2 上没有 SSL。 IIS 没有 SSL 绑定,我们没有该站点的 SSL 证书。我已经尝试过与此类似的标准超链接的最简单情况:&lt;a href="http://app2.mydomain.com/Tickets/frmTicket.aspx?ticketid=26&amp;showreply=true&amp;popup=true" target="_blank"&gt;View Ticket&lt;/a&gt;。如果我直接在地址栏中打开 URL,则会加载票证并填充下拉菜单(通过 ajax)。如果我单击 App1 呈现的页面中的链接,那么虽然票证加载没有任何下拉菜单有任何成员,但 ajax 不起作用,我在 chrome 中看到错误消息。
    • 在 Chrome 调试器的“网络”面板中,您可以看到您的 App2 内部的所有 AJAX 调用。所以在你看到你的错误信息之后,你能看看面板并找到触发它的 AJAX 调用吗?如果是这样,请告诉我们关于“请求 URL”、“请求方法”和“表单数据”的内容。这将是一个好的开始,因为现在,这就像在迷雾中寻找......
    【解决方案5】:

    我的解决方案是:在应用程序 1 中创建一个方法 your method 在服务器端调用应用程序 2,然后您可以使用 AJAX 调用 your method 这将返回应用程序 2 的结果。

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 2011-11-16
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      相关资源
      最近更新 更多