在文章“从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能”中分析了CORS返回空200的问题后,进一步对APIM的CORS策略进行验证,深入学习<CORS 跨域资源共享>。

首先,我们已经学习到CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,整个CORS通信过程,都是浏览器自动完成,不需要用户参与。而服务端则不同,它是实现CORS通信的关键。只要服务器实现了CORS接口,就可以跨源通信。本文中服务端就是Azure APIM (https://portal.azure.cn/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.ApiManagement%2Fservice)。

在APIM中,是通过配置策略(Policy)来实现CORS设置的。在APIM门户中由多种级别可以开启CORS,可以根据API的使用情况灵活配置不同的跨域策略(cors policy)。

1) 产品级别(Products Policies):作用范围为产品下的全部API

2) All APIs 级别 (Inbound processing):作用范围为当前APIM中的所有API,所以在查看策略时,一定要注意是否由全局策略

3) All operstions 级别(Inbound processing):作用范围为当前一个API下面的所有操作,如GET, POST, PUT....

4) One Operation级别 (最原子级,只影响一个操作): 有效范围仅对当前配置的一个操作

以上四个级别一一对应下图中1,2,3,4标记位:

跨域请求成功 VS 失败

浏览器将CORS请求分成两类:简单请求(simple request)非简单请求(not-so-simple request), 如何区别这两者可参考:[HTTPS]跨域资源共享 CORS 详解 -[转自:阮一峰的网络日志 » 首页 » 档案 http://www.ruanyifeng.com/blog/2016/04/cors.html]

对比一:简单请求 GET

浏览器直接发出CORS请求。会在Requst头信息之中,增加一个Origin字段,值为浏览器中的URL。服务器根据这个值,决定是否同意这次请求。

  • 如果Origin指定的域名,不在许可范围内,服务器会返回一个正常的HTTP回应(200的空返回)。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段,就知道出错了,从而抛出一个CORS error错误。
  • 如果Origin指定的域名,在许可范围内,服务器返回的响应,会多出几个Access-Control-* 头信息字段。
CORS error 浏览器表现(打开开发者模式窗口可见 F12)
GET CORS 请求错误,不包含Access-Control-Allow-Origin字段
GET CORS 请求成功,包含Access-Control-Allow-Origin字段

对比二:非简单请求 OPTIONS, POST

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是POST, PUTDELETE,或者Content-Type字段的类型是application/json。非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

  • 如果服务器否定了"预检"请求,会返回一个正常200的HTTP回应,但是没有任何CORS相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此触发一个错误.
  • 如果服务器收到"预检"请求以后,检查了OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。关键的是Access-Control-Allow-Origin字段,表示可以请求数据。也可以为星号,表示同意任意跨源请求。
OPTIONS请求跨域失败
OPTIONS请求跨域成功

POST 请求跨域成功

(PS: 以上数据在测试中通过Fiddler抓包获取到OPTIONS和POST请求数据)

结论:

在遇见CORS报错后,查看请求的返回内容即可得出是否在服务端正确配置源站点 ​​​​​  ​​​​​​​​​​​​​​  ​​​​​​​ ​​​​​​​​​​​​​

参考资料

API Management cross domain policies:https://docs.microsoft.com/en-us/azure/api-management/api-management-cross-domain-policies#CORS

跨域资源共享 CORS 详解:http://www.ruanyifeng.com/blog/2016/04/cors.html

【Azure API 管理】APIM CORS策略设置后,跨域请求成功和失败的Header对比实验的更多相关文章

  1. Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

    由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为 ...

  2. SpringBoot设置支持跨域请求

    跨域:现代浏览器出全的考虑,在http/https请求时必须遵守同源策略,否则即使跨域的http/https 请求,默认情况下是被禁止的,ip(域名)不同.或者端口不同.协议不同(比如http.htt ...

  3. CORS和jsonp实现跨域请求

    同源策略:所谓同源是指,域名,协议,端口相同,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略.当浏览器同时打开两个tab页面(两个不同服务器 ...

  4. nodeJS中express框架设置全局跨域请求头

    //设置跨域请求头 router.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin&qu ...

  5. 跨域访问 - 跨域请求 同源策略概念对跨域请求的影响 及几种解决跨域请求的方法如 jsonp

    为什么会设置同源策略 > 适用于浏览器的一种资源访问策略 > 同源策略(Same origin policy)是一种约定,它是浏览器最核 心也最 基本的安全功能,如果缺少了同源策略,则浏览 ...

  6. php 设置允许跨域请求

    php 服务端代码 <?php header('Content-Type: text/html;charset=utf-8'); header('Access-Control-Allow-Ori ...

  7. Django设置允许跨域请求

    方式一: 在中间件中 def process_response(self, request, response): response['Access-Control-Allow-Origin'] = ...

  8. 在 ASP.NET Core 中启用跨域请求(CORS)

    本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS. 浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务. 此限制称为相同源策略. 同一源策略可防止恶意站点读取另一个站点中 ...

  9. 【fetch跨域请求】cors

    当使用fetch 发起跨域请求时,CORS(跨域资源共享Cross-origin resource sharing) 请求fetch const body = {name:"Good boy ...

随机推荐

  1. 如何在windows上升级Powershell到5.1版本?

    前言 此篇我们说的是Powershell5.1低版本到5.1的升级,对于Powershell6(及以上版本)可以跨平台独立安装,在windows上可与之前的版本并存. 首先要整清楚Powershell ...

  2. 在kubernetes集群里集成Apollo配置中心(1)之交付Apollo-adminservice至Kubernetes集群

    1.部署apollo-adminservice软件包 apollo-adminservice软件包链接地址:https://github.com/ctripcorp/apollo/releases/d ...

  3. kubernetes进阶(六)k8s平滑升级

    当我们遇到K8S有漏洞的时候,或者为了满足需求,有时候可能会需要升级或者降级版本, 为了减少对业务的影响,尽量选择在业务低谷的时候来升级: 首先准备好文件:我这里选择的是内网文件服务器上下载的,请自行 ...

  4. HDU 3920 Clear All of Them I(状压DP)题解

    题意:2n个点,一个起点,开n枪,每枪必须打两个点,花费为起点到其中一点距离加上两点距离.问打完2n个点的最小花费. 思路:很显然应该dp状态,然后枚举i j两个空位置去填,那么复杂度$O(20 * ...

  5. tensorflow-gpu+"Failed to create session"

    成因: 未给系统指定相应使用的GPU 解决: 层面1: 针对单个程序: CUDA_VISIBLE_DEVICES=0 python main.py import os; os.environ['CUD ...

  6. macOS 需要更新软件才能连接到 iOS 设备

    macOS 需要更新软件才能连接到 iOS 设备 更新 Mac 上的软件 如果您在 iPhone.iPad 或 iPod touch 上看到"需要更新软件才能连接到 iOS 设备" ...

  7. GitHub & Hacker & MicroSoft

    GitHub & Hacker & MicroSoft GitHub源码被黑客洗劫和勒索事件 微软也未能幸免 https://www.cnbeta.com/articles/tech/ ...

  8. vux使用

    Vue中使用vux的配置,分为两种情况: 一.根据vux文档直接安装,无需手动配置 npm install vue-cli -g // 如果还没安装 vue init airyland/vux2 my ...

  9. NGK Global首尔站:内存是未来获取数字财富的新模式

    近日,NGK路演在NGK韩国社区的积极举办下顺利落下帷幕.此次路演在首尔举行,在活动当天,NGK的核心团队成员.行业专家.投资银行精英.生态产业代表和数百名NGK韩国社区粉丝一起参加NGK Globa ...

  10. BGV上线两天价格超过880美金,下一个YFI已到来!

    BGV自上线以来就备受币圈关注,众多投资者纷纷表示看好BGV.BGV也不负众望,在上线交易所第二天,价格就迎来了暴涨,最高价格为888.88美金,超越了当前以太坊的价值.而这也迎来了币圈众多投资者的一 ...