今天谈谈跨域

182 阅读2分钟

什么是同源

同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。
例如qq.comww.baidu.com 不同源,www.baidu.combaidu.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进行跨域,我们要:
  1. qq.com先将数据写到一个js文件中
  2. frank.com用一个script标签引用这个js
  3. 这个js文件执行frank.com事先准备好的window.xxx函数
  4. frank.com就可以通过window.xxx获取到数据

完整代码可以看这里