什么是CORS
首先得知道什么是浏览器的同源策略?从浏览器获取html页面开始,我们从一台服务器(ip+端口+http协议)中获取了html文档
在html文档中使用ajax技术,通过xhr对象发送网络请求,那么这个xhr的源即是这个HTML文档的归属服务器,如果有条件可以在orgin:xxx
看到
浏览器拒绝不同源的内容相互发送请求,但是有时候为了需要还是想要实现跨域请求,这就有了cors
Cors实现
如何实现cors?实现跨域也就是同另一台服务器(准确来说是另一个源,毕竟还有端口号的限制)进行交流,服务器可以决定一个资源是否能够被跨域访问到
也就是决定权掌握在了服务端。
至于浏览器又做了什么?浏览器会对你的请求进行判断,区分简单请求和需要预检的请求
简单请求和预检请求
简答请求限制条件有点多,可以自行去MDN看看
除去简单请求之后就是预检请求,预检请求存在的目的要说一下,请求有安全性之分,也就是是否会影响到服务器的数据,很多请求都是不安全的,为了防止这样的事情出现,所以发送请求前先发送一个options方法的请求,看看服务端支持那些域的请求以及请求方法等信息
Cors和身份验证相关
通常发送请求都会带上cookie,那么跨域请求是否支持cookie相关的验证工作呢?
一般来说,浏览器在执行跨域相关的操作的时候是不会带上cookie之类的,如果是实在需要带上cookie,需要在跨域阶段做说明
同样的分两种请求讨论,第一种是简单请求
简单请求没有预检操作,直接设置xhr.withCredentials=ture
就能让浏览器带上cookie
但是服务器可能不认你浏览器私自的操作,如果服务器端的响应中未携带 Access-Control-Allow-Credentials: true
,浏览器将不会把响应内容返回给请求的发送者。
第二种是带预检操作的请求
发送options请求,在收到服务器响应的Access-Control-Allow-Credentials: true
首部之后来携带cookie
但是使用了与身份验证相关的字段之后,又会代理一些限制,比如说
也就是相关的响应不能直接使用通配符*了,而是要指明具体的内容