什么是同源
同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。
例如qq.com 和 ww.baidu.com 不同源,www.baidu.com 和 baidu.com 也不同源,两者必须完全一致才同源。
同源策略就是浏览器的一个安全限制,它阻止了不同域之间进行的数据交互。例如一个在源A里面运行的JS,就只能获取源A的数据,不能获取源B的数据,也就是不允许跨域。
什么是跨域
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。那么我们运行在源A中的JS想要获得源B的数据。要怎么办呢?我们提供下面两个方法。
CORS 跨域
两个不同源的网站,要想共享数据,可以使用CORS跨域,方法是提前声明(Access-Control-Allow-Origin)。
假设我们现在有两个网站,frank.com:9999和 qq.com, frank.com想要访问qq.com:9999的数据,那么qq.com 的响应头里会包含以下代码
response.setHeader("Access-Control-Allow-Origin", "http://frank.com:9999");
这样我们的frank.com:9999想要拿到qq.com的数据就轻而易举了
JSONP 跨域
其他情况下,我们想要跨域,由于浏览器不支持CORS,我们必须要使用另外一种方法来跨域,这个时候我们可以请求一个JS文件,这个JS文件会执行一个回调,回调里面就有我们想要的数据,这个回调再以callback的方式传递给后台,后台会把这个函数返回给我们并执行,这就是JSONP。
- 优点:实现跨域;兼容IE
- 缺点:由于它是script标签,所以它读取不到精确地状态码和响应头,它只知道成功或者失败;只能发GET请求,不支持POST 例子同上,如果是用JSONP进行跨域,我们要:
- qq.com先将数据写到一个js文件中
- frank.com用一个script标签引用这个js
- 这个js文件执行frank.com事先准备好的window.xxx函数
- frank.com就可以通过window.xxx获取到数据