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

时间:2012-08-17 21:08:58

标签: cors

我正在构建一个使用CORS的REST应用程序。每个REST调用都是不同的,我发现获得预检OPTIONS调用会有很大的开销。有没有办法缓存并应用预检OPTIONS结果,以便对同一域的任何后续调用都使用缓存的响应?

2 个答案:

答案 0 :(得分:95)

预检只能应用于请求,而不能应用于整个域。我在邮件列表上提出了同样的问题,并且存在安全问题。这是整个帖子: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标头,但最大值为10分钟。

接下来请注意,不可能避免对PUT / DELETE请求进行预检。因此,更新/删除API需要每10分钟至少进行一次预检。

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

如果你愿意改变你的API的“RESTful”程度,你可以尝试更多的东西。一种是使用不需要预检的Content-Type,例如'text / plain'。自定义标题始终会触发预检,因此如果您有任何自定义标题,则可以将它们移动到查询参数中。在极端情况下,您可以使用JSON-RPC之类的协议,其中所有请求都发送到单个端点。

老实说,由于浏览器的预检缓存限制为10分钟,以及REST的资源网址,预检缓存相当无用。在长时间运行的应用程序中,您无法限制预检。我希望CORS规范的作者将来会尝试解决这个问题。

答案 1 :(得分:4)

尝试使用xDomain

如果使用angular或jQuery,我的设置非常简单。在您的应用服务器上,按照以下链接中的帮助添加proxy.html。添加一些标签,引用“客户”和中提琴上的js文件,不再需要预先飞行。这包含在一个iframe中,以避免需要检查。

https://github.com/jpillora/xdomain