即使使用自定义标头,如何禁用预检请求

Posted

技术标签:

【中文标题】即使使用自定义标头,如何禁用预检请求【英文标题】:how to disable preflight request even with custom headers 【发布时间】:2018-07-20 11:58:47 【问题描述】:

我需要一个在这方面经验丰富且知识渊博的人,以便他可以为我提供建议。我将详细解释我的情况。 我写了一个restful api。这是一个超级巨大的 api,我正在使用前端 SPA (vue.js,真的没关系)。有很多页面我发出 3-4 个不同的 api 请求(获取不同的信息)。真正让我生气的是发生了预检请求。这意味着如果转到一个页面需要 4 个请求,它不会执行 4 个 api 请求,它会发出 4 * 2 = 8 个 api 请求,因为 preflight OPTIONS 请求。我不需要它,因为我知道 cors 并且我可以正确设置 cors 以便在每次请求之前我不需要预检来检查请求是否安全。 (如果我的域不知道 cors,PREFLIGHT 是一种很好、快速的方法(不是最佳方法),可以消除可能来自不同域到我域的任何威胁,所以 preflight 会为我辩护并告诉他我的域不知道关于cors,他不能从其他来源向我的来源提出请求。我也给了你一些信息。

现在是时候禁用它了,我知道它不需要请求正文,所以它可能很快,但我仍然不想要它。我想禁用它。我知道这是可能的。我在***中读了很多,人们说你只需要将内容类型设置为text/plain。或其他一些解决方案,但他们说如果你使用自定义标题,那么这是不可能的。我使用自定义标头,以便将身份验证令牌(承载)传递给我的 api 中间件。一定有办法以某种方式禁用它。

非常感谢您的任何建议。

【问题讨论】:

【参考方案1】:

好的,第一步是从预检 OPTIONS 请求中返回 Access-Control-Max-Age 响应标头。这指定了 OPTIONS 响应在浏览器中缓存的时间长度。如果你返回这个,那么浏览器将停止发送预检请求。好吧,它最初会为每个请求发送一个,但之后,它将使用浏览器中的缓存版本。

【讨论】:

以上是关于即使使用自定义标头,如何禁用预检请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CORS 预检 OPTIONS 请求中发送自定义标头?

Cors - 如何处理需要自定义标头的预检选项请求? (AWS:使用 vpc 端点的私有 API 网关)

如何启用 CORS 的 Apache Web 服务器(包括预检和自定义标头)?

Angular HTTP 拦截器自定义预检

JQuery、CORS 和自定义响应标头

自定义请求头引起预检请求