同源策略
浏览器故意设计的一个功能限制
- 源和同源
输入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的参数传给后台,后台把这个函数再返回给我们,再执行。
优点:
- 兼容IE
- 可以跨域
缺点:
- 由于是script标签,所以他读不了AJAX那么精确(不知道状态码和响应头),只知道成功和失败。
- 由于是script标签,只能发get请求,即JSONP不支持post。