我有一个系统,负责将作业分发到运行在不同机器上的一组浏览器。每个浏览器都会重新加载一个页面,等待作业进入。
每个作业要做的一件事是向本地机器上运行的本地服务器发出跨域JSONP请求,以便从系统中获取一些信息。这适用于我尝试过的所有浏览器,除了Opera。
以下是我用来发出请求的jQuery代码:
$.ajax({
url: "http://10.20.30.40:8000/...",
dataType: "jsonp",
data: someData
success: function(data) { ... }
});
10.20.30.40
主机是本地IP地址,用于标识在具有浏览器的机器上运行的本地服务器。发出此请求的页面是从像blah.internal.example.com
这样的域名加载的,该域名对我们网络中的所有机器都可见。
Opera发出的第一个这样的请求(我使用的是12.02)成功了。然而,以同样方式提出的后续请求实际上从未提出过。它们不会显示在检查器的网络选项卡中。在控制台中,会显示一条消息,说明Linked script not loaded
。
我相信这条消息(以及没有请求)是由Opera的跨网络安全触发的,这在本博客文章中有描述。在Stackeexchange上,这个答案提出了一个解决方法,但它需要用户交互。对于我的用例,浏览器是由脚本启动、停止和运行的,所以用户交互不是一个选项。
有没有办法在Opera中完全禁用这种跨网络安全性,或者对从特定"受信任"主机加载的页面禁用这种安全性?我需要一个可以在偏好设置或opera:config
中进行的更改,该更改将在会话之间具有粘性。(所有这些计算机都在内部控制的页面上运行在内部网络上,所以我不担心跨网络攻击。)
如果您可以在Opera 12+(以及其他所有浏览器,甚至IE8)中使用CORS,为什么要使用JSONP?它很有魅力。
只是不要忘记将所需的Access-Control-Allow-*
标头添加到本地服务器。
更多信息请访问Opera开发网络:http://dev.opera.com/articles/view/dom-access-control-using-cross-origin-resource-sharing/
尝试在opera:config#Cross%20Network中完全禁用安全功能(似乎SO不允许我链接到该功能。)
当然,如果你禁用了安全功能,你应该从此谨慎地冲浪。..;-)