背景 我们有两个托管在不同子域上的Web应用程序。 Application 1是一个内部管理系统。 Application 2是一个帮助台系统。
我们可以修改Application 1的源代码,但我们无权修改Application 2。
目标 要显示应用程序1中将打开新窗口的订单的链接,其URL应用于应用程序2中的故障单。
我们的员工可以看到订单上面有一张帮助台票,只需点击订单上的链接查看票据并回复即可。
问题 无论我如何打开新窗口(window.open,target =" _blank"等),新窗口中的故障单都无法将任何ajax请求返回到托管它的帮助台系统。
新窗口的URL是Application 2的一部分。
在谷歌开发工具中它告诉我"请求访问的帧具有" http"的协议,被访问的帧具有" https"的协议。协议必须匹配。"即使我用_blank打开它。
如果我手动转到完全相同的网址,一切正常......但是当我需要它从链接工作时,这并没有帮助。
有没有办法实现上述目标?
如果没有,有什么方法可以打开一个新的窗口,它是"分离的"从打开它的窗口,以便相同的原始政策不再适用?
编辑2014-03-28 10:23 我根本无法访问App2的代码。我无法对App2进行任何更改。任何答案都必须考虑到这一点。
我正在尝试从我的应用程序(App1)打开一个新窗口,其中该窗口的目标URL是App2中的页面。然后,App2中的该页面需要能够使用ajax与App2的其他区域进行通信。这就是问题所在。因为App1打开了窗口,所以相同的源策略阻止该窗口进行它的ajax请求。
答案 0 :(得分:2)
您可以使用代理服务器或iframe proxying。
答案 1 :(得分:2)
我怀疑第二个(帮助台)应用上的JavaScript试图通过window.opener
访问第一个应用(这可能会导致您看到的跨源错误)和后续JavaScript(获取内容)通过AJAX)然后没有被执行。您可以通过在第二个应用程序中设置适当的断点来缩小范围。
如果这是原因并且您无法修改帮助台应用的来源,那么如何转到内部域中的网址,然后重定向到服务台?重定向应该使window.opener
属性变为null
(与在URL中手动输入相同)。
假设https://admin.mydomain.co.uk和http://helpdesk.mydomain.co.uk,点击"帮助故障单"链接将转到内部应用中的网址,例如https://admin.mydomain.co.uk/getHelp?ticketId,会以301
响应和适当的Location: http://helpdesk.domain.uk/help/ticketId
标头回复,将用户带到实际的帮助台网址。
答案 2 :(得分:0)
使用以下网址//app2.mydomain.co.uk,不使用http或https。
答案 3 :(得分:0)
它不仅是跨域问题,还是协议问题: 您无法在没有此警告的情况下将https嵌入到http页面中。
考虑在App1中使用iframe:
<iframe src="https://app2.mydomain.co.uk" ></iframe>
或许您可以使用CORS访问两个域之间的数据(但我认为这不重要,您想要整个App2页面,不是吗?)
修改:通过重新阅读您的问题,我非常确定两件事:
所以我的猜测是:你在没有SSL(没有https)的情况下调用App2,但在App2中,有一些涉及https(当然是一些ajax查询)。所以这就是问题:当你打开没有https的页面时,它似乎加载,但是当第一个https Ajax触发时,它就会失败。
在调用App2网址时尝试使用https,并向我们提供结果
答案 4 :(得分:0)
我的解决方案是:在应用程序1中,您创建一个方法your method
,在服务器端调用应用程序2,然后您可以使用AJAX调用your method
,它将返回应用程序2的结果。