1. 什么是同源?
要搞懂同源,首先就得知道什么是源。
源
当你在浏览器输入window.origin或location.origin就可以得到当前的源。
控制台输入:location.origin
得到的结果:'https://www.baidu.com'
源的结构是这样的:
源 = 协议 + 域名 + 端口号(默认是80就不写)
同源
现在你就了解什么是源了,那么同源,顾名思义。
同源:如果两个url的协议、域名、端口号完全一致,那么这两个url就是同源的。同源政策是浏览器故意设计的一个功能限制。
下面举个例子:
https://qq.com、https://www.baidu.com不同源
https://baidu.com、https://www.baidu.com不同源
只有协议、域名、端口号完全一致才同源。
这么做的优点就是:可以保护用户隐私(注意!是保护用户而不是服务器)
但是随之而来的缺点就是:会被浏览器住址获取其响应。
为了解决这个问题,就有跨域。
2. 什么是跨域?
跨域,就是浏览器由于同源策略不执行其他网站的脚本。是为了解决浏览器的同源策略所出现的。
3. JSONP和CORS
为了实现跨域,就出现了两种方式:JSONP和CORS。
1. JSONP
JSONP就是:跨域时,由于浏览器不支持,于是请求一个js文件进行回调,回调名字可以随机取的,是一个随机数,这个数以callback的参数传给后台,后台返回后能继续执行。
JSONP的优点:
- 支持IE
- 可以跨域
JSONP的缺点:
- 不能像ajax那么精确,即无法获取状态码等等
- 不支持post,因为他是script,只能发get请求
现在IE已经几乎绝迹,既然如此,为何不使用一个更加简单的方式?那就用CORS吧!
2. CORS
CORS就是跨域资源共享,是突破浏览器限制的一个方法。是为了解决浏览器默认不同源之间不能互相访问数据而产生的方法。
只需要是在网站的响应头里填写可以访问的网站名单,浏览器就会获得一个准许访问的名单,名单上的网站就能跨域访问。
请求又分为简单请求和复杂请求。
简单请求
简单请求有:GET
、HEAD
、POST
简单请求声明语法:Access-Control-Allow-Origin:http://for.wxample
复杂请求
复杂请求有:PATCH
复杂请求声明语法:
Access-Control-Allow-Origin: https://甲站点
Access-Control-Allow-Methods:POST、GET、OPTIONS、PATCH
Access-Control-Allow-Headers:Content-Type