1.7. CORS
通常,HTTP 客户端无法在不同域间发出请求。
例如,假设您与 Kafka 集群一起部署的 Kafka Bridge 可使用 http://my-bridge.io
域访问。HTTP 客户端可以使用 URL 与 Kafka Bridge 交互,并通过 Kafka 集群交换信息。但是,您的客户端在 http://my-web-application.io
域中作为 Web 应用程序运行。客户端(源)域与 Kafka Bridge (目标)域不同。由于相同的原始策略限制,来自客户端的请求会失败。您可以使用 Cross-Origin 资源共享(CORS)来避免这种情况。
CORS 允许在不同的域中的原始源之间的 simple 和 preflighted 请求。
简单请求适用于使用 GET
、HEAD
、POST
方法的标准请求。
preflighted 请求会发送 HTTP OPTIONS 请求,作为初始检查实际请求是否安全发送。确认时,发送实际请求。preflight 请求适用于需要更大的保护方法,如 PUT
和 DELETE
,并使用非标准标头。
所有请求都需要在其标头中有一个 origin 值,即 HTTP 请求的来源。
CORS 允许您指定允许的方法和原始 URL,以便在 Kafka Bridge HTTP 配置中访问 Kafka 集群。
Kafka Bridge 的 CORS 配置示例
# ... http.cors.enabled=true http.cors.allowedOrigins=http://my-web-application.io http.cors.allowedMethods=GET,POST,PUT,DELETE,OPTIONS,PATCH
1.7.1. 简单请求
例如:这个简单请求标头将源指定为 http://my-web-application.io
。
Origin: http://my-web-application.io
标头信息添加到要使用记录的请求中。
curl -v -X GET HTTP-BRIDGE-ADDRESS/consumers/my-group/instances/my-consumer/records \
-H 'Origin: http://my-web-application.io'\
-H 'content-type: application/vnd.kafka.v2+json'
在 Kafka Bridge 的响应中,会返回一个 Access-Control-Allow-Origin
标头。它包含可从中向网桥发出 HTTP 请求的域列表。
HTTP/1.1 200 OK
Access-Control-Allow-Origin: * 1
- 1
- 返回星号(
*
)显示资源可以被任何域访问。
1.7.2. preflighted 请求
使用 OPTIONS
方法将初始 preflight 请求发送到 Kafka Bridge。HTTP OPTIONS 请求发送标头信息,以检查 Kafka Bridge 是否允许实际请求。
在这里,preflight 请求会检查 POST
请求是否从 http://my-web-application.io
有效。
OPTIONS /my-group/instances/my-consumer/subscription HTTP/1.1 Origin: http://my-web-application.io Access-Control-Request-Method: POST 1 Access-Control-Request-Headers: Content-Type 2
OPTIONS
被添加到 preflight 请求的标头信息中。
curl -v -X OPTIONS -H 'Origin: http://my-web-application.io' \ -H 'Access-Control-Request-Method: POST' \ -H 'content-type: application/vnd.kafka.v2+json'
Kafka Bridge 响应初始请求,以确认请求将被接受。响应标头返回允许的源、方法和标头。
HTTP/1.1 200 OK Access-Control-Allow-Origin: http://my-web-application.io Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS,PATCH Access-Control-Allow-Headers: content-type
如果原始或方法被拒绝,则返回错误消息。
实际请求不需要 Access-Control-Request-Method
标头,因为它已在 preflight 请求中确认,但它需要 origin 标头。
curl -v -X POST HTTP-BRIDGE-ADDRESS/topics/bridge-topic \
-H 'Origin: http://my-web-application.io' \
-H 'content-type: application/vnd.kafka.v2+json'
响应显示允许原始 URL。
HTTP/1.1 200 OK Access-Control-Allow-Origin: http://my-web-application.io
其他资源