最近更新时间:2020-04-29 14:19:04
浏览器出于安全性考虑,会限制从页面脚本内发起的跨域访问(CORS)请求,此时页面只能访问同源的资源,而CORS允许浏览器向跨域服务器,发送XMLHttpRequest请求,从而实现跨域访问。
浏览器将CORS请求分为两类:简单请求和非简单请求。
当请求同时满足下面三个条件时,CORS验证机制会使用简单模式进行处理。
1.请求方法是下列之一:
GET
HEAD
POST
2.请求头中的Content-Type请求头的值是下列之一:
application/x-www-form-urlencoded
multipart/form-data
text/plain
3.Fetch规范定义了CORS安全头的集合(跨域请求中自定义的头属于安全头的集合)该集合为:
Accept
Accept-Language
Content-Language
Content-Type (需要注意额外的限制)
DPR
Downlink
Save-Data
Viewport-Width
Width
不满足以上2个条件的,都为非简单请求。对于非简单请求,在正式通信之前,浏览器会增加一次HTTP查询请求,称为预检请求。浏览器询问服务器,当前页面所在的源是否在服务器的许可名单之中,以及可以使用哪些HTTP请求方法和头信息字段。预检通过后,浏览器向服务器发送简单请求。
API网关默认所有API允许跨域访问,因此如果用户的API后端服务的应答中不做特殊返回,API网关会返回允许所有域跨域访问的相关头,下面是一个示例:
客户端的API请求
GET /simple HTTP/1.1
Host: ksyun.com
orgin: http://www.ksyun.com
content-type: application/x-www-form-urlencoded; charset=utf-8
accept: application/json; charset=utf-8
date: Mon, 18 Sep 2019 12:50:23 GMT
后端服务应答
HTTP/1.1 200 OK
Date: Mon, 18 Sep 2019 12:50:23 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 12
{"200","OK"}
API网关应答
HTTP/1.1 200 OK
Date: Mon, 18 Sep 2019 12:50:23 GMT
Access-Control-Allow-Origin: *
x-kscapigw-request-id: 104735BD-8968-458F-9929-DBFA43F324C6
Content-Type: application/json; charset=UTF-8
Content-Length: 12
{"200","OK"}
从上面三个报文可以看出,API网关会对用户的后端服务应答做一定修改,增加一个跨域头:
Access-Control-Allow-Origin: *
这个跨域头的意思是,本API允许所有域的请求访问。
如果用户需要定制针对简单请求的应答的跨域头,只需要在后端服务应答中,增加Access-Control-Allow-Origin这个跨域头即可,后端服务应答中的头会默认覆盖掉API网关自己增加的头。下面是一个例子,这个例子中的API只允许http://www.ksyun.com 这一个域访问:
客户端的API请求
GET /simple HTTP/1.1
Host: www.ksyun.com
orgin: http://www.ksyun.com
content-type: application/x-www-form-urlencoded; charset=utf-8
accept: application/json; charset=utf-8
date: Mon, 18 Sep 2019 12:50:23 GMT
后端服务应答
HTTP/1.1 200 OK
Access-Control-Allow-Origin:http://www.kysun.com
Date: Mon, 18 Sep 2019 12:50:23 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 12
{"200","OK"}
API网关应答
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://www.ksyun.com
x-kscapigw-request-id: 104735BD-8968-458F-9929-DBFA43F324C6
Date: Mon, 18 Sep2019 12:50:23 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 12
{"200","OK"}
纯净模式