厚学网  |  培训首页 > web前端培训头条 > JavaScript 跨域原理

JavaScript 跨域原理

  1、 基调

  一般情况下,禁止一个域从另一个域读取数据,却可以使用某些从其他域拿到的资源。比如说,允许一个域执行、渲染、应用从其他域获取到的脚本、图片、样式;同样,一个域可以展示从其他域获取的内容,比如在 frame 中显示 html 文档。网络资源也可以选择性的让其他域来读取自己的信息,比如使用 cross-origin resource sharing,这种情况下访问权是针对单个域授 权的。

  同源策略限制消息从一个域发送到另一个域。比如说同源策略允许域间的 get 和 post 方式的 http 请求,却禁止域间的 put 和 delete 方式的请求。同时,域在发送请求到自己时可以自定义 http 请求头,发送请求到其他域不能自定义请求头。

  同源策略的控制者是浏览器,浏览器可以控制不同域之间的资源的访问或相互操作,但不控制自己对不同域之间的资源的操作和访问。

  2、 什么是源

  rfc6454 规定一个资源的源由资源的 uri 中的(协议,主机,端口)这一个三元组来确定(ie 中没有把端口纳入源的属性)。

  对于一个被执行的脚本来说,他的源属性是执行这个脚本的资源的源属性。比如一个页面加载了来自另一个域的脚本,这个脚本执行的时候向页面所在域发送请求被视为同源。

  相对路径和无法明确源属性的协议(javascript:,data:,about:blank)的资源的源,取将这些资源载入的页面的源。

  ie 没有将端口作为同源的组成部分,原因是 ie 历史垄断的市场占有率导致的历史遗留问题,ie8 尝试在原生的 xmlhttprequest 中使用端口作为同源的一部分(标准化),但效果不好,一些依照老 ie 特性开发的站点,为了保持兼容性,继续使用了原有的 msxml 方式的 xmlhttprequest。所以在 ie8-11 的版本都没有考虑端口作为同源的判断条件。

  3、 怎样算同源

  两个资源的组成源的属性(协议,主机,端口),完全一致,这两个资源才同源。这里如果两个资源的协议分别为 http 和 https 被认为不同源。

  

文中图片素材来源网络,如有侵权请联系删除
在线咨询
全国招生热线