我正在构建一个使用 CORS 的 REST 应用程序。每个 REST 调用都是不同的,我发现获取预检 OPTIONS 调用的开销很大。有没有办法缓存和应用预检选项结果,以便对同一域的任何后续调用都使用缓存的响应?
最佳答案
预检只能应用于请求,不能应用于整个域。我在邮件列表中提出了同样的问题,但存在安全问题。这是整个线程:http://lists.w3.org/Archives/Public/public-webapps/2012AprJun/0228.html
如果您想限制预检请求的数量,有几件事需要考虑。首先请注意,基于 WebKit/Blink 的浏览器将最大预检缓存设置为 10 分钟:
https://github.com/WebKit/webkit/blob/master/Source/WebCore/loader/CrossOriginPreflightResultCache.cpp
https://chromium.googlesource.com/chromium/blink/+/master/Source/core/loader/CrossOriginPreflightResultCache.cpp
(我不确定这是否适用于其他浏览器)。因此,虽然您应该始终设置 Access-Control-Max-Age header ,但最大值为 10 分钟。
接下来请注意,无法避免 PUT/DELETE 请求的预检。因此,更新/删除您的 API 至少需要每 10 分钟进行一次预检。
在 GET/POST 上,尽可能避免使用自定义 header ,因为它们仍会触发预检。如果您的 API 返回 JSON,请注意“application/json”的 Content-Type 也会触发预检。
如果您愿意改变 API 的“RESTful”程度,那么您还可以尝试一些其他方法。一种是使用不需要预检的内容类型,如“文本/纯文本”。自定义标题总是会触发预检,因此如果您有任何自定义标题,您可以将它们移动到查询参数中。在极端情况下,您可以使用像 JSON-RPC 这样的协议(protocol),其中所有请求都发送到单个端点。
老实说,由于浏览器的预检缓存限制为 10 分钟,以及 REST 的资源 url,预检缓存相当无用。在长时间运行的应用程序过程中,您几乎无法限制预检。我希望 CORS 规范的作者将来会尝试解决这个问题。
关于cors - 如何将 CORS 预检缓存应用于整个域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12013216/