如何将CORS预检caching应用于整个域

我正在构build一个使用CORS的REST应用程序。 每个REST调用都是不同的,我发现在获得预检OPTIONS调用时有很大的开销。 有没有办法来caching和应用预检选项结果,以便任何后续调用到同一个域使用caching的响应?

印前检查只能应用于请求,而不能应用到整个域。 我在邮件列表中提出了同样的问题,并且存在安全问题。 这是整个线程: http : //lists.w3.org/Archives/Public/public-webapps/2012AprJun/0228.html

如果您想限制预检请求的数量,有几件事情需要考虑。 首先请注意,基于WebKit / Blink的浏览器设置10分钟的最大预检caching:

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标题时,最大值是10分钟。

接下来请注意,不可能避免在PUT / DELETE请求上进行预检。 因此,更新/删除您的API将需要每10分钟至less一个预检。

在GET / POST上,尽可能避免使用自定义标题,因为这些仍然会触发预检。 如果您的API返回JSON,请注意,“application / json”的Content-Type也会触发预检。

如果你愿意弯曲你的API的“RESTful”,那么你可以试试更多的东西。 一种是使用不需要预检的Content-Type,如“text / plain”。 自定义标题总是触发预检,所以如果您有任何自定义标题,您可以将它们移动到查询参数中。 在极端情况下,您可以使用像JSON-RPC这样的协议,其中所有请求都发送到单个端点。

诚然,由于浏览器的预检caching极限为10分钟,而REST的资源URL,预检caching相当无用。 在长时间运行应用程序的过程中,您可以做很less的事情来限制预检。 我希望CORS规范的作者将在未来试图解决这个问题。

尝试使用xDomain

对于我来说,如果使用angular或jQuery,设置起来非常简单。 在您的应用程序服务器上,添加一个proxy.html,如下面链接的帮助中所述。 在你的“客户端”和中提琴上添加一些引用js文件的标签,不再有预购航class。 这包装在一个iframe中,以避免需要检查。

https://github.com/jpillora/xdomain