对于非简单请求
或者初次请求失败后,浏览器会使用 options
方法发起 `preflight request'
preflight request
也就是通常所说的预检请求,如果预检请求失败,可能会出现如下的错误:
Access to XMLHttpRequest at 'http://localhost:8080/security/' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
preflight request
一般会包括一下几个信息:Access-Control-Request-Method 和 Access-Control-Request-Headers,以及一个 Origin 首部
比如客户端在发起 DELETE 请求之前会发起如下的预检请求:
OPTIONS /resource/foo
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: origin, x-requested-with
Origin: https://foo.bar.org
如果服务器允许 DELETE 请求,就会发回如下的回应:
HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400
预检请求会做如下的检查:
access-control-request-method
(当前为 DELETE),是否在 Allow-Methods
列表中因此上面失败的 log 意味着第二个检查的失败,此种情况是服务器根本没有返回 Access-Control-Allow-Origin
头部
More: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS