request - 预检请求不允许 POST 方法后,浏览器仍发送 HTTP POST 请求

标签 request cors http-post http-method

我对我的 API 服务器(NodeJS Express)只允许 GET 方法感到困惑

res.setHeader('Access-Control-Allow-Methods', 'GET');

然后我发出带有 header 的 CORS POST 请求

headers: {
  'Content-Type': 'application/json',
  'X-Test-Header': 'TESTING'
}

(目的是强制浏览器在 POST 请求之前调用 OPTIONS 请求)。然后我检查 Chrome 调试中的网络选项卡,它确实发送了 2 个请求(首先是 OPTIONS,然后是 POST 请求)。 OPTIONS请求的响应头为:

Access-Control-Allow-Methods: GET

问题是为什么当POST动词未包含在Allow-Methods header 中时它仍然调用POST请求?

谁知道这个请给我解释一下。提前致谢。

P/S:使用DELETE或PUT方法,会抛出错误

has been blocked by CORS policy: Method PUT is not allowed
by Access-Control-Allow-Methods in preflight response.

我认为使用 POST 方法它必须抛出相同的错误来指示该方法不允许

P/S:我仍然面临这个问题,有谁知道并向我解释一下,先谢谢了

最佳答案

我最近也遇到了同样的问题。我在fetch spec中找到了这个,我认为它可以用作真正的 http 规范的引用,因为 fetch API 必须遵守它。根据步骤7,如果CORS check返回成功,则会执行步骤7.5,推断请求的方法是否有效。我们可以注意到,如果请求的方法不在Access-Control-Allow-Methods中,并且它不是CORS安全列表方法(GET ,POST,HEAD),它会抛出错误。

从上面的推论,我们可以知道这是因为您的预检通过了CORS检查,即使请求的方法与Access-Control-Allow-Methods不匹配 strong>,由于它是一个CORS安全列表方法,因此不会抛出错误。

考虑到,如果您想禁止 POST 方法,则不应让它通过 CORS 检查。例如,请勿在响应中设置 Access-Control-Allow-Origin。无论您设置什么 Access-Control-Allow-Methods 都不重要,因为它是一个 CORS 安全列表方法

关于request - 预检请求不允许 POST 方法后,浏览器仍发送 HTTP POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54631433/

相关文章:

java - 这个 CORS 处理程序安全吗?

javascript - 检测cors是否启用?

java - Android,POST JSON 数组,php 调试

android - 使用对象作为参数从 Java 调用 RESTful WCF 服务方法

离线时的 Android Volley 存储请求

asp.net - HttpContext.Request.Cookies和HttpContext.Response.Cookies之间的关系

javascript - XMLHttpRequest无法加载XXX No'Access-Control-Allow-Origin' header

c# - 使用来自 $http post 服务的模型重定向到 MVC View

java - 如何更改 HttpServletRequest.servletpath?

javascript - NodeJS 异步函数中的返回变量