问题 跨域Web工作者?


我有 https://domain1.com (domain1)和 https://domain2.com (域2)。

Domain2提供包含javascript的页面,标题为“Access-Control-Allow-Origin:*”

Domain1运行一些调用的javascript代码:

new Worker("//domain2.com/script.js")

浏览器抛出安全异常。

自从开始编写这个问题以来,我已经解决了这个问题,通过ajaxing脚本,blobbing它并从中运行它,但是我错过了原始想法中的一些东西吗?


6589
2017-12-05 20:33


起源

有一个副本 这里 和 这里 但他们似乎都没有明确的答案。 - adeneo
根据,使用ajax - 数据URL方法并不适用于所有浏览器 MDN页面。 - Pointy
据我所知,从W3C规范来看,规则意味着工作者脚本确实必须来自与拥有页面相同的域。我认为甚至不检查CORS头。 - Pointy
@Pointy数字,因为网络选项卡甚至没有建议它甚至拿取页面进行检查。那么如果AJAX可以做到,为什么我们不能直接做到呢? :/ - user1277170
我不知道它的工作方式背后的基本原理。在ajax的情况下,那是一个较旧的标准。再次注意,使用该解决方法不一定有效,因为某些浏览器会考虑您构建的数据URL 不 算作网络工作者的“同源”。 - Pointy


答案:


我也有同样的问题,希望这可以帮到你 https://gist.github.com/jtyjty99999/a730a17258fca04bfca3

 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();

7
2017-11-14 04:25



请注意,这不适用于IE11及以下版本。那组浏览器扔了一个 SecurityError。 - Yuriy Nemtsov
哇,就像这个解决方案。特别是链接 new Blob 同 URL.createObjectURL。不知道有可能。 - reski


注意:作为Worker构造函数的参数传递的URI必须遵守   同源政策。目前存在分歧   浏览器厂商关于哪些URI是同源的; ...

引用自 https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

HTML5 Worker是一个相当新的概念,但我不确定同源原因是如何应用的 XmlHttpRequest,可以访问不同域上的资源 如果你可以控制它运行的服务器。通过访问外部域的资源 预先请求 意味着首先将OPTIONS请求发送到资源,如果对该响应的响应具有适当的访问控制头(Access-Control-Allow-MethodsAccess-Control-Allow-Origin 作为最小值,然后使用原始方法重复该请求并接收响应的资源。


5
2017-12-05 20:51



这是真的。但是,从Web worker脚本提取过程的描述中,不清楚用户代理是否应该检查标头。它只是强制从拥有的页面原点获取URL,并设置“强制同源标志”以确保重定向不会影响它。 - Pointy
我不确定......引用的文档说“另外,他们可以使用XMLHttpRequest执行I / O ......”。鉴于此,我假设底层传输仍然是标准的HTTP请求。 - marekful
哦,是的,我认为这是真的。但是 规范 我建议用户代理只能从“所有者来源”获取脚本。 - Pointy
关于这一点的规范是模棱两可的 owner origin。显然,MDN文档说“作为Worker构造函数的参数传递的URI必须遵循同源策略”并且关于同源策略,它表示在某些条件下允许跨源访问: developer.mozilla.org/en-US/docs/Web/JavaScript/... - marekful
这是有道理的,因为限制跨源访问的目的是在其所有者不希望访问资源时阻止访问资源。但是,如果您是多个来源的所有者,则可以跨越其中的访问资源。 - marekful


你有方法设置吗?

尝试将此添加到标题中:

Access-Control-Allow-Methods: POST, GET, OPTIONS

-1
2017-12-05 20:38



不,不行。 - user1277170