CORS优于跨域消息传递

时间:2011-11-18 17:41:09

标签: javascript cross-domain postmessage cors

CORS和跨域消息传递看起来与我相同:它们允许跨域通信。

是否有任何理由使用其中一种?

3 个答案:

答案 0 :(得分:10)

CORS适用于闪存通常不允许的ajax请求或闪存请求。例如,如果域x没有跨域策略,并且您通过闪存从那里检索mp3文件进行播放,则flash不允许您读取mp3文件的id3标签。对于ajax,如果目标服务器没有允许您的域发出请求的跨域策略,则您无法提出请求。

跨域消息传递允许您与来自不同来源的文档中的iframe进行通信。例如,如果您有youtube视频iframe,则可以将消息传递给该iframe以更改音量。通常不会进行任何通信,因为iframe的来源不同,因此您无法以编程方式对youtube iframe执行任何操作。

使用其中一种或另一种的原因现在应该清楚了。 CORS允许您在主窗口和iframe之间传递消息时使用来自其他来源的数据,当您想要与iframe内部但不在同一来源的应用程序进行通信时。

一个实际的例子:

1.你有一个拥有youtube播放器的iframe。

2.您要求从youtube数据api播放一些视频(CORS,可能是JSONP,XHR或其他)。

3.您现在将跨域邮件传递给iframe,以开始播放您在步骤2中请求的任何视频

答案 1 :(得分:1)

首先,您应该知道以下浏览器支持CORS:Internet Explorer 8 +,Firefox 3.5 +,Safari 4+和Chrome。请注意,IE7和旧版本的Firefox和Safari根本不支持它。但事件IE8有一些限制 - 它不支持凭据和“预检”请求发送到服务器。 此外,您的服务器应该为CORS请求做好准备,即也应该执行服务器上的一些额外工作。

使用JSONP或iFrame的跨域消息传递在浏览器支持方面更为通用,有时甚至不需要额外的服务器端工作。

答案 2 :(得分:0)

我相信问题的精神是“对于进行跨域XHR,CORS和基于iframe + postMessage的方法的相对优缺点是什么?”

解释它们的用途并没有真正帮助回答这个问题。

在这里,我尝试从服务提供商的角度回答这个问题,该提供商希望向特定的已知页面/域提供“服务”(数据,行为),并且需要那些域能够“呼入”到它。

CORS

  • 优点
    • 易于理解它何时在客户端上运行/超级容易(不需要任何复杂的逻辑,只需执行简单的XmlHttpRequest / fetch调用即可完成操作)
  • 缺点

iframe + postMessage

  • 优点
    • SameSite cookie处理不是问题(跨越域边界的是postMessage调用,而不是XHR调用)
    • 简单的服务器端实现(只托管一个包含您的JS代码和跨域消息传递规则的“页面”;大多数复杂性最终出现在前端JS中)
  • 缺点
    • 在客户端上有更多工作;如果您提供服务,而不是提供简单的终结点,则需要交付“ SDK”,即要在目标页面中执行的脚本。
    • 潜在的复杂/经常被误解的客户端实现(指定应允许哪些来源发布给您,等等)
    • 处理大消息时的影响可能比到达的XHR有效负载大吗? https://dassur.ma/things/is-postmessage-slow/
    • 如果您设置“ X-Frame-Options”以帮助保护您的(服务提供)网站,则可能会很复杂-您需要为消息传递iframe主机“页面”添加豁免。

(请调整/纠正/添加!)