CORS

跨域资源共享(CORS)机制支持浏览器和网络服务器之间安全的跨域请求和数据传输。 CORS 标准的工作原理是添加新的 HTTP 标头,允许服务器描述允许读取该信息的来源集。 该策略提供 CORS 支持,使用额外的 HTTP 标头,让客户端或应用程序获得访问选定资源的权限。 当应用程序或客户端从不同于当前请求来源的域、协议或端口请求资源时,就会发出跨来源 HTTP 请求。

如果要在 webMethods API Gateway 在 API 层应用此策略,请确保已将 watt.server.cors.enabled 属性设置为 false

注意: 集成服务器 CORS 策略和 webMethods API Gateway CORS 策略不能共存。 在集成服务器级别执行 CORS 策略时,会对所有请求执行 CORS 策略。 预检请求由集成服务器处理,甚至在它到达 webMethods API Gateway.

本政策适用于 REST、SOAP 和 ODATA API。 下表列出了可以为该策略指定的 CORS 响应规范:

属性 描述
允许的源 指定允许响应的来源。

的语法: scheme://host:port

单击 "添加 "按钮可添加多个来源。

您还可以为允许的来源提供正则表达式。

也可以在应用程序下的高级部分指定允许的来源。 在此 API 注册的应用程序的允许来源也允许访问此 API。

允许标题 指定允许在请求中使用的标头。

点击 图标 ,可以添加多个允许使用的标题。

暴露头 指定在请求失败时暴露给用户的标头。

点击 图标 ,可以添加多个允许使用的标题。

允许凭证 指定是否 webMethods API Gateway 是否包含 Access-Control-Allow-Credentials 头信息。
允许的方法 指定请求中允许使用的方法。

指定以下一种或多种:GET、POST、PUT、DELETE 和 PATCH。

最长生存期 指定预检响应的有效期。

根据规范,所有值都会设置相应的 HTTP 标头。 有关其他信息,请参见 https://www.w3.org/TR/cors/.

webMethods API Gateway 以不同方式处理 CORS 预检请求和 CORS 请求。 要进一步了解 CORS 预检和 CORS 请求的工作流程,请参阅相应的流程图。

CORS 预飞请求

CORS 预检请求是浏览器在原始 CORS 请求之前发送的 HTTP 请求,以检查服务器是否允许实际 CORS 请求。 webMethods API Gateway 服务器是否允许实际 CORS 请求。 CORS 预检请求使用 OPTIONS 方法,并将这些标头作为浏览器向 API Gateway 发送的请求的一部分:

  1. 访问控制-请求-方法
  2. 访问控制-请求-标头

下面的流程图解释了 API Gateway 中收到的 CORS 预飞行请求的流程:

Cors 安置

下表列出了来自浏览器的 CORS 预检请求的各种使用情况,以及如何 webMethods API Gateway 如何响应每个 CORS 预检请求:

# 来自浏览器的 CORS 预检请求标头 中配置的 CORS 策略 webMethods API Gateway webMethods API Gateway 向浏览器发送相应的响应
1

原产地 http://test.com

访问-控制-请求-方法:POST

Access-Control-Request-Headers : test1,test2

Access-Control-Allow-Origin : http://test2.com

Access-Control-Allow-Methods:POST,GET,PUT

访问控制-允许-标头 : test1,test2

发送 403 Specified Origin is not allowed 状态,因为浏览器的 Origin 标头 ( http://test.com ) 与 CORS 策略中配置的 Access-Control-Allow-Origin ( http://test2.com ) 不匹配。
2

原产地 http://test2.com

访问控制请求方法:删除

Access-Control-Request-Headers : test1,test2

Access-Control-Allow-Origin : http://test2.com

Access-Control-Allow-Methods:POST,GET,PUT

访问控制-允许-标头 : test1,test2

Sends 405 Method Not Allowed 状态,因为浏览器的 Access-Control-Request-Method 标头 (DELETE) 与 CORS 策略中配置的 Access-Control-Allow-Methods (POST,GET,PUT) 不匹配。
3

原产地 http://test2.com

访问-控制-请求-方法:POST

Access-Control-Request-Headers : test3

Access-Control-Allow-Origin : http://test2.com

Access-Control-Allow-Methods:POST,GET,PUT

访问控制-允许-标头 : test1,test2

Sends 403 Header Not Supported因为浏览器的 Access-Control-Request-Headers 头信息 ( test3 ) 与 CORS 策略中配置的 Access-Control-Allow-Headers 头信息 ( test1,test2 ) 不匹配。
4

原产地 http://test2.com

访问-控制-请求-方法:POST

Access-Control-Request-Headers : test1

Access-Control-Allow-Origin : http://test2.com

Access-Control-Allow-Methods : POST

Access-Control-Allow-Headers : test1、 test2

访问控制-最大年龄: 100

Access-Control-Allow-Credentials : true

访问控制-暴露-标头 : header1,header2

发送带有以下标头的 200 OK 状态:
  • Access-Control-Allow-Origin : http://test2.com
  • Access-Control-Allow-Methods:POST,GET,PUT
  • 访问控制-允许-标头 : test1,test2
  • 访问控制-最大年龄: 100
  • Access-Control-Allow-Credentials : true

由于浏览器的起源、方法和标头与 webMethods API Gateway.

5

原产地 http://test2.com

访问-控制-请求-方法:POST

Access-Control-Request-Headers : test1

Access-Control-Allow-Origin : http://test1.com

Access-Control-Allow-Methods : POST

Access-Control-Allow-Headers : test1、 test2

访问控制-最大年龄: 100

Access-Control-Allow-Credentials : true

访问控制-暴露-标头 : header1,header2

此外,如果在应用程序中将 javascript 起源指定为 http://test2.com

发送带有以下标头的 200 OK 状态:
  • Access-Control-Allow-Origin : http://test2.com
  • Access-Control-Allow-Methods:POST,GET,PUT
  • 访问控制-允许-标头 : test1,test2
  • 访问控制-最大年龄: 100
  • Access-Control-Allow-Credentials : true

尽管浏览器的起源标头与配置的 CORS 策略不匹配,但它与应用程序中配置的 javascript 起源相匹配。

CORS 申请

CORS 请求是包含 Origin 标头的 HTTP 请求。 当 webMethods API Gateway 收到 CORS 请求时,会根据 CORS 策略中配置的 Access-Control-Allow-Origin 对 CORS 请求中的 Origin 标头进行验证,如果匹配,则 API Gateway 允许访问资源。

下面的流程图解释了在 webMethods API Gateway.

要求

下表详细介绍了源于浏览器的 CORS 请求的各种使用情况,以及如何响应每个 CORS 请求。 webMethods API Gateway 如何响应每个 CORS 请求。

# 来自浏览器的 CORS 请求标头 中配置的 CORS 策略 webMethods API Gateway webMethods API Gateway 向浏览器发送相应的响应
1

原产地 http://test.com

Access-Control-Allow-Origin : http://test2.com

Access-Control-Allow-Methods:POST,GET,PUT

访问控制-允许-标头 : test1,test2

访问控制-最大年龄: 100

Access-Control-Allow-Credentials : true

访问控制-暴露-标头 : header1,header2

发送 403 Specified Origin is not allowed 状态,因为浏览器的 Origin 标头 ( http://test.com ) 与 CORS 策略中配置的 Access-Control-Allow-Origin ( http://test2.com ) 不匹配。
2

原产地 http://test2.com

Access-Control-Allow-Origin : http://test2.com

Access-Control-Allow-Methods:POST,GET,PUT

访问控制-允许-标头 : test1,test2

访问控制-最大年龄: 100

Access-Control-Allow-Credentials : true

访问控制-暴露-标头 : header1,header2

发送带有以下标头的 200 OK 状态:
  • Access-Control-Allow-Origin :

    http://test2.com

  • Access-Control-Allow-Credentials : true
  • 访问控制-暴露-标头 : header1,header2

http://test2.com 由于来自浏览器的 "原产地 "标头 ( http://test2.com ) 与在 webMethods API Gateway.

3

原产地 http://test2.com

访问-控制-请求-方法:POST

Access-Control-Request-Headers: test1

Access-Control-Allow-Origin : http://test1.com

Access-Control-Allow-Methods : POST

访问控制-允许-标头 : test1,test2

访问控制-最大年龄: 100

Access-Control-Allow-Credentials : true

访问控制-暴露-标头 : header1,header2

此外,如果在应用程序中将 javascript 起源指定为 http://test2.com

发送带有以下标头的 200 OK 状态:
  • Access-Control-Allow-Origin: http://test2.com
  • Access-Control-Allow-Methods:POST,GET,PUT
  • Access-Control-Allow-Headers: test1,test2
  • Access-Control-Max-Age:100
  • Access-Control-Allow-Credentials : true

尽管浏览器的起源标头与配置的 CORS 策略不匹配,但它与应用程序中配置的 javascript 起源相匹配。

注:
  • 如果本地服务支持 CORS 机制,且未在 API Gateway 中配置 CORS 策略,则 webMethods API Gateway 就会转入直通安全模式,并将 CORS 请求转发给本地服务。
  • 如果本地服务支持 CORS 机制,并且您还在 API Gateway 中配置了 CORS 策略,则 webMethods API Gateway 会优先处理 CORS 请求。