什么是同源
-
浏览器规定如果 JS 运行在源 A里那么就只能获取源 A 的数据,不能获取源 B的数据,即不允许跨域
-
同源策略是浏览器故意设计的一种功能限制.
-
同源定义:不同源的页面之间,不准互相访问数据
-
源 :window.origin 或 location.origin 可以得到当前源
-
源 = 协议+域名+端口号
-
如果两个 url 的 协议/域名/端口号 都一致的话那么这两个 url 就是同源的
示例:
- qq.com 和 www.baidu.com 不同源
- baidu.com 和 www.baidu.com 不同源 只有完全一致才是同源的
什么是跨域
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 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 的一些细节描述可参考:
- 前端通过构造 src 形如
xxx.com/friends.json?callback=xxxx的 script 标签请求; - 后端通过约定的查询参数(这里是 callback)取出值(这里是 xxxx)然后把数据作为参数传给取出的值(这个值得在前端作为全局作用域下的一个函数);
- 返回形如
xxxx(data)的 JS 响应体; - 前端解析执行返回的 JS 代码(处理 data 的逻辑封装成 xxxx 全局函数)。
更详细的资料可参考 wiki。