跨域

332 阅读1分钟

同源策略

浏览器故意设计的一个功能限制

  • 源和同源

输入window.origin或者location.origin可以得到当前源

源=协议+域名+端口号,若两个url的协议,域名,端口号完全一致,那么这两个url就是同源的。

  • 同源策略

浏览器规定,如果JS运行在源A里,那么就只能获取源A的数据,不能获取源B的数据。也就是说,不同源的页面之间,不准互相访问数据,即不允许跨域。

note: referer可以看出发的请求是否有区别。

Q: 为什么可以跨域使用CSS,JS和图片?

A: 同源策略限制的是数据访问,我们只是引用了CSS,JS和图片,但不知道其具体内容。

CORS(跨域资源共享)

突破浏览器数据共享限制的方法,要共享数据前,需要提前声明。

添加响应头:

response.setHeader('Access-Control-Allow-Origin','http://foo.example')

CORS分为简单请求和复杂请求,具体看MDN文档

JSONP

在跨域时,因为某些条件,当前浏览器不支持CORS,必须使用另一种方式跨域。于是我们请求一个JS文件,这个JS文件会执行一个回调(callback),回调里就有想要的数据。

回调名字是可以随机生成的一个随机数,用这个名字以callback的参数传给后台,后台把这个函数再返回给我们,再执行。

优点:

  1. 兼容IE
  2. 可以跨域

缺点:

  1. 由于是script标签,所以他读不了AJAX那么精确(不知道状态码和响应头),只知道成功和失败。
  2. 由于是script标签,只能发get请求,即JSONP不支持post。