《 跨域 》

141 阅读3分钟

什么是同源

  • 浏览器规定如果 JS 运行在源 A里那么就只能获取源 A 的数据,不能获取源 B的数据,即不允许跨域

  • 同源策略是浏览器故意设计的一种功能限制.

  • 同源定义:不同源的页面之间,不准互相访问数据

  • :window.origin 或 location.origin 可以得到当前源

  • = 协议+域名+端口号

  • 如果两个 url 的 协议/域名/端口号 都一致的话那么这两个 url 就是同源的

示例


什么是跨域

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 JavaScript 实施的安全限制。 无法跨域是浏览器对于用户安全的考虑,为了保护客户的隐私,如果自己写个没有同源策略的浏览器,完全不用考虑跨域问题了 。


跨域资源共享 CORS 跨域

CORS 是一个 W3 C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。 COR S需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。 整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。 因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信。

语法:Access-Control-Allow-Origin:http//foo.example


JSONP

JSONP 是为了在跨域时某些条件不支持 CORS,必须用另一种方式跨域,于是请求 JS 文件回调一个JS 参数

步骤示例

Frank.com 访问 qq.com

  • qq.com 将数据写到 /friends.js
  • Frank.com 用script 标签引用 /friend.js
  • /friends.js 执行 Frank.com 事先定义好的 window.xxx 函数
  • /friends.js 执行 window.xxx ({friends:[...]})
  • 然后 Frank.com 通过window.xxx 获取数据

优点:兼容IE跨域,可以跨域

缺点:由于时 script 标签读不到AJAX那么准确状态。 只能发 GET 请求,不支持 Post

JSONP 的一些细节描述可参考

  1. 前端通过构造 src 形如 xxx.com/friends.json?callback=xxxx 的 script 标签请求;
  2. 后端通过约定的查询参数(这里是 callback)取出值(这里是 xxxx)然后把数据作为参数传给取出的值(这个值得在前端作为全局作用域下的一个函数);
  3. 返回形如 xxxx(data) 的 JS 响应体;
  4. 前端解析执行返回的 JS 代码(处理 data 的逻辑封装成 xxxx 全局函数)。
    更详细的资料可参考 wiki

学习小记,有错误请指正.MDN 大法