开启跨域访问

最近更新时间: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网关实现简单模式CORS跨域请求

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"}

金山云,开启您的云计算之旅

免费注册