什么是跨域
所有的浏览器为了保护用户隐私都有一个同源策略,即不同网站之间是不能互相访问数据的。
但在实际使用中,我们有时候会需要突破同源限制进行跨域。
常用的跨域方案是CORS,当我们不能使用CORS时(如IE不支持CORS),我们可以使用JSONP。
同源策略
- 源
源 = 协议+域名+端口号
我们在浏览器中输入 window.origin 或 location.origin 即可得到当前源
- 同源
如果两个 url 的源(协议,域名,端口号)完全一致,那么就可以将这两个 url 称为同源的。
- baidu.com & www.baidu.com 并不是同源的,因为其域名并不一样。
在历史上曾经出现过不同的公司,共用域名,ip的情况,所以,浏览器为了谨慎起见,要求必须源完全一致才允许访问数据。
- 同源策略
如果一个JS运行在 源A 中,那么其不能获取 源B 的数据。即不允许 跨域。
跨域方案一:CROS
MDN规定了若允许跨域,需要在请求头中进行设置(Access-Control-Allow-Origin)。
跨域方案二:JSONP
JOSNP 其实和 JSON 并没有关系,只是一开始这个技术被用于 JSON上,所以被称为JSONP。(P 是padding的意思,JSONP的意思就是有内边距的JSON)
- JSONP的步骤
- 将所需要的数据写到一个js文件中(将数据挂到一个函数( fn() ) 上
- 通过script标签将js文件引入到不同源的网站内。
- 在不同源的网站内事先定义好 fn (回调)
- 当不同源的网站引入到script标签时就会执行 fn
- 此时,我们就能跨域获取到数据了
为了保证fn的名字不会与其他函数的名称冲突,我们可以通过 Math.random() 来随机生成一个函数名,通过设置查询参数 callback 传给后台,后台通过 query.callbak 就能那个获取到随机的函数名,对js文件中的函数名进行设置了。
此时,我们会发现一个问题,那就是谁都可以访问这个js文件了,数据的安全性就得不到保护了,因此,我们需要判断对方的referer,来决定要不要将js传给对方。
JSONP的优点:可以兼容IE,可以进行跨域
JSONP的缺点:由于其本质是一个script标签,所以只能发送get请求,不支持post,
且不像ajax那样,它读不到状态码