前端知识自理——跨域

291 阅读3分钟

跨域

跨域是老生常谈的一个前端问题。那么到底什么是跨域? 在了解跨域前,我们需要知道一个前置知识点:同源策略

同源策略

同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。 ——MDN

同源策略是对JavaScript代码能够操作哪些Web内容的一条完整的安全限制。当Web页面使用多个<iframe>元素或者打开其他浏览器窗口的时候,这一策略通常就会发挥作用。具体来说,脚本只能读取和所属文档来源相同的窗口和文档的属性 ——《JavaScript权威指南》第六版

同源

如果两个URL的protocol、port、host都相同,那么我们称这两个URL是同源。 这个方案也被称为“协议/主机/端口元组”,或者直接是“元组”。(“元组”是指一组项目构成的整体,双重/三重/四重/五重/等的通用形式)。

我们用 [www.ywf.cn/home/index.…] 为源,判断下面的url

URL 结果
www.ywf.cn/home/info.h… 同源
www.ywf.cn:8080/home/index.… 跨域(端口号不同)
www.ywf.cn/home/detail… 跨域(协议不同)
www.baidu.cn/home/index.… 跨域(主机不同)

IE中源的差别

Internet Explorer 的同源策略有两个主要的差异点:

  • 授信范围(Trust Zones):两个相互之间高度互信的域名,如公司域名(corporate domains),则不受同源策略限制。
  • 端口:IE 未将端口号纳入到同源策略的检查中。即 www.ywf.cn:80/home/index.…www.ywf.cn:88/home/index.… 当做同源看待。

跨域网络访问

以下不受同源策略影响的嵌入跨域资源:

  • <script scr="..."></script>嵌入跨域脚本。PS:错误信息只能被同源脚本捕捉到。
  • <img>展示的图片。
  • <video><audio>嵌入的多媒体资源。
  • <object><embed><applet>嵌入的对象/插件
  • <iframe>载入的资源。PS:被载入的站点可以设置X-Frame-Options属性来防止被其他网站以<iframe>形式载入。什么是 X-Frame-Options?
  • @font-face引入的字体。PS:只有部分浏览器允许跨域。

解决跨域问题

所以,当两个URL不同源时,就产生了跨域的问题。这样的同源策略带了安全的同时,也带来了许多通信间的麻烦。 做项目开发的时候难免会有项目之间的相互通信。现在前后端分离普及后,跨域更是成了拦路虎般的存在。所以也渐渐诞生了许多办法去绕开这个烦人的同源策略。

修改domain

domain

domain 属性可返回下载当前文档的服务器域名。

用法: document.domain

例子: 在百度页面中F12,console中输入document.domain,返回"www.baidu.com"。我们可以在js语句中将domain修改为有效的域前缀或它本身,例如"baidu.com"。但我们不能将domain设置为顶级域名,例如"com"。

如果两个窗口(窗体)包含的脚本把domain设置成了相同的值,name这两个窗口就不再受同源策略的约束,他们可以相互读取对方的属性。

demo