在后端接口使用了cors跨域处理(后端通过修改Access-Control-Allow-origin来支持跨域)浏览器发出cors相关请求时会在头信息之中,增加一个Origin
字段。
浏览机器一旦发现跨域请求,就会自动添加一些附加的头信息,有时还会多出一次附加的请求(浏览器自动完成,用户不会察觉),服务器响应特定标头Access-Control-,体现对跨源访问的授权态度
跨域过程分析:
浏览器先根据同源策略对前端页面和后台交互地址做匹配,若同源,则直接发送数据请求;若不同源,则发送跨域请求。
服务器收到浏览器跨域请求后,根据自身配置返回对应文件头。若未配置过任何允许跨域,则文件头里不包含 Access-Control-Allow-origin 字段,若配置过域名,则返回 Access-Control-Allow-origin + 对应配置规则里的域名的方式。
浏览器根据接受到的 响应头里的 Access-Control-Allow-origin 字段做匹配,若无该字段,说明不允许跨域,从而抛出一个错误;若有该字段,则对字段内容和当前域名做比对,如果同源,则说明可以跨域,浏览器接受该响应;若不同源,则说明该域名不可跨域,浏览器不接受该响应,并抛出一个错误。
浏览器将cors请求分为简单请求和非简单请求
1.简单请求
- 只要同时满足以下三大条件,就属于简单请求。
- 请求方法是以下三种方法之一:
HEAD
GET
POST - HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID - Content-Type:只限于三个值
application/x-www-form-urlencoded
、multipart/form-data
、text/plain
2.非简单请求
- 浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的
XMLHttpRequest
请求,否则就报错。- 浏览器否定了"预检"请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此触发一个错误,被
XMLHttpRequest
对象的onerror
回调函数捕获 - 一旦服务器通过了"预检"请求,浏览器正常的CORS请求,就都跟简单请求一样,会有一个
Origin
头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin
头信息字段。
- 浏览器否定了"预检"请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此触发一个错误,被
踩坑:
低版本浏览器对通配符*的兼容问题导致跨域失败,具体分析:https://juejin.cn/post/7126828512480559111