跨域访问是指请求一个与自身资源不同源(不同的域名、协议或端口)的资源。不同源可以是不同的域名、协议或端口。
CORS
跨域访问是指请求一个与自身资源不同源(不同的域名、协议或端口)的资源。不同源可以是不同的域名、协议或端口。
浏览器出于安全考虑设置了同源策略,限制了从脚本内发起跨域请求。但在实际应用中,经常会发生跨域访问。为此,W3C 提供了一个标准的跨域解决方案:跨域资源共享(Cross-Origin Resource Sharing,CORS),支持安全的跨域请求和数据传输。
浏览器将 CORS 请求分为以下两类:
- 简单请求 
- 预检请求:防止资源被本来没有权限的请求修改的保护机制。浏览器会在发送实际请求之前使用 - OPTIONS方法发送一个预检请求,从而获知服务端是否允许该跨域请求。服务端确认允许后,才会发起实际的 HTTP 请求。
简单请求
请求满足如下所有条件,为简单请求:
- 请求方法是如下之一: - HEAD
- GET
- POST
 
- HTTP 头信息不超过以下几种字段: - Cache-Control
- Content-Language
- Content-Type
- Expires
- Last-Modified
- Pragma
- DPR
- Downlink
- Save-Data
- Viewport-Width
- Width
 
- Content-Type的值仅限下列几种:- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
 
预检请求
不符合简单请求条件的请求,会在正式通信之前触发一个 OPTIONS 请求进行预检。这类请求为预检请求。
预检请求会在请求头中附带一些正式请求的信息给服务端,主要有:
- Origin:请求源信息。
- Access-Control-Request-Method:接下来的请求类型,如 POST、GET 等。
- Access-Control-Request-Headers:接下来的请求中包含的用户显式设置的 Header 列表。
服务端收到预检请求后,会根据上述附带的信息判断是否允许跨域,通过响应头返回对应的信息:
- Access-Control-Allow-Origin:允许跨域的 Origin 列表。
- Access-Control-Allow-Methods:允许跨域的方法列表。
- Access-Control-Allow-Headers:允许跨域的 Header 列表。
- Access-Control-Expose-Headers:允许暴露的 Header 列表。
- Access-Control-Max-Age:最大的浏览器缓存时间,单位:秒。
- Access-Control-Allow-Credentials:是否允许发送 Cookie。
浏览器会根据返回的 CORS 信息判断是否继续发送真实的请求。以上行为都是浏览器自动完成的,服务端只需要配置特定的 CORS 规则。
网关对 CORS 的支持
网关提供了配置 CORS 规则的功能,让业务方决定是否允许特定的跨域请求。该规则以 appId + workspaceId 维度配置。
配置 CORS
登录 mPaaS 控制台,完成以下步骤:
- 在左侧导航栏,点击 移动网关 菜单。 
- 选择 网关管理 标签页,点击右侧的 功能开关 标签页,进行 CORS 配置。 
开启 CORS 后,app 在该 workspace 下的所有 API 服务都将支持符合以下配置的跨域请求:
- 允许来源: - Access-Control-Allow-Origin,可以设置多个,逗号分割,允许“*”通配符。
- 允许方法: - Access-Control-Allow-Methods,可以选择多个。
- 允许标头: - Access-Control-Allow-Headers,可以设置多个,逗号分割,允许“*”通配符。
- 公开标头: - Access-Control-Expose-Headers:可以设置多个,逗号分割,不允许“*”通配符。
- 有效期: - Access-Control-Max-Age,最大的浏览器缓存时间,单位:秒。
- 允许凭证: - Access-Control-Allow-Credentials,是否允许发送 Cookie。
跨域请求
跨域的 API 请求要添加 X-CORS-${appId}-${workspaceId} 请求头。当预检请求到达网关后,网关解析 Access-Control-Request-Headers 中的 X-CORS-${appId}-${workspaceId} 获取 appId 和 workspaceId,再进一步获取对应的 CORS 配置。网关跨域请求的请求头中要包含如下内容:
- X-CORS-\${AppId}-\${WorkspaceId}:一定要有此请求头,并用实际的 AppId 和 WorkspaceId 替换占位符内容; 
- Operation-Type 
- WorkspaceId 
- AppId 
- Content-Type 
- Version 
$.ajax({
    url: 'http://${mpaasgw_host}/mgw.htm',// 请填写网关地址
    headers: {
      'X-CORS-${appId}-${workspaceId}':'1' // 一定要设置这个请求头
      'Operation-Type':${operationType}, // 请填写 operationType
      'AppId':${appId}, // 请填写 appId      
      'WorkspaceId':${worksapceId}, // 请填写 worksapceId
      'Content-Type':'application/json',
      'Version':'2.0',
    },
    type: 'POST',
    dataType: 'json',
    data: JSON.stringify(reqData),
    success: function(data){}
  });CORS 配置中的 允许标头 配置,根据实际情况添加或者设置 “*”。