Javascript 跨域网络工作者?
我有(域名1)和(域名2) Domain2提供包含以下标题的javascript的页面:Javascript 跨域网络工作者?,javascript,html,cross-domain,web-worker,Javascript,Html,Cross Domain,Web Worker,我有(域名1)和(域名2) Domain2提供包含以下标题的javascript的页面: "Access-Control-Allow-Origin: *" Domain1运行一些javascript代码,调用: new Worker("//domain2.com/script.js") 浏览器抛出安全异常 自从开始写这个问题以来,我一直通过调整脚本、填充脚本并从中运行脚本来解决这个问题,但我是否在最初的想法中遗漏了一些东西?您是否设置了允许方法 尝试将
"Access-Control-Allow-Origin: *"
Domain1运行一些javascript代码,调用:
new Worker("//domain2.com/script.js")
浏览器抛出安全异常
自从开始写这个问题以来,我一直通过调整脚本、填充脚本并从中运行脚本来解决这个问题,但我是否在最初的想法中遗漏了一些东西?您是否设置了允许方法 尝试将其添加到标题中:
Access-Control-Allow-Methods: POST, GET, OPTIONS
注意:作为辅助构造函数的参数传递的URI必须遵守
同一原产地政策。目前,各方存在分歧
同一来源的URI上的浏览器供应商
引自
HTML5 Worker是一个相当新的概念,我不确定同源异常是如何应用的,但是,对于
XmlHttpRequest
,如果您能够控制它运行的服务器,就可以访问不同域上的资源。通过访问外域上的资源意味着首先向资源发送一个选项请求,如果对该请求的响应具有适当的访问控制头(访问控制允许方法
,访问控制允许来源
),然后,使用原始方法重复请求并接收资源响应。我也有同样的问题,希望这能帮助您
这很有趣,但工人内部没有相同的原产地限制。所以我使用了这个简单的解决方法:
const workerUrl='1〕https://domain2.com/script.js';
const workerBlob=新Blob([
'importScripts('+JSON.stringify(workerUrl)+'),
],{type:'application/javascript'});
const blobUrl=window.URL.createObjectURL(workerBlob);
施工工人=新工人(blobUrl);
比手动获取脚本要简单一些。有一个副本,但它们似乎都没有明确的答案。据介绍,使用ajax-data URL方法不会在所有浏览器中都有效。据我所知,从W3C规范来看,这些规则意味着工作脚本确实必须来自与所属页面相同的域。我认为CORS标题甚至没有被检查。@Pointy数字,因为network选项卡甚至不表示它正在获取要检查的页面。那么,如果AJAX可以做到这一点,为什么我们不能直接做到呢/我不知道它的工作原理。在ajax的情况下,这是一个较旧的标准。再次注意到,使用这种解决方案并不一定有效,因为一些浏览器会认为,您构建的数据URL不等于Web工作者的“同源”。这是真的。然而,从web worker脚本获取过程的描述来看,不清楚用户代理是否应该检查头。它只是强制从拥有的页面来源获取URL,并设置“强制相同来源标志”以确保重定向不会影响这一点。我不确定。。。引用的文档说“此外,他们可以使用XMLHttpRequest执行I/O…”。鉴于此,我假设底层传输仍然是标准的HTTP请求。但是向我建议,用户代理应该只从“所有者来源”获取脚本。这方面的规范对于
所有者来源
是不明确的。显然,MDN文档说“作为辅助构造函数的参数传递的URI必须遵守同源策略”和大约同源策略,它说在某些条件下允许跨源访问:这是有意义的,因为限制跨源访问的目的是防止在资源所有者不希望访问资源时访问资源。但是,如果您是多个来源的所有者,您可能会在它们之间交叉访问资源。请注意,这在IE11及以下版本中不起作用。这组浏览器抛出了一个安全性错误
。哇,就像这个解决方案一样。特别是用URL.createObjectURL
链接newblob
。我不知道这是可能的。
function XHRWorker(url, ready, scope) {
var oReq = new XMLHttpRequest();
oReq.addEventListener('load', function() {
var worker = new Worker(window.URL.createObjectURL(new Blob([this.responseText])));
if (ready) {
ready.call(scope, worker);
}
}, oReq);
oReq.open("get", url, true);
oReq.send();
}
function WorkerStart() {
XHRWorker("http://static.xxx.com/js/worker.js", function(worker) {
worker.postMessage("hello world");
worker.onmessage = function(e) {
console.log(e.data);
}
}, this);
}
WorkerStart();