首页 文章

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

提问于
浏览
70

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

3 回答

  • 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上,尽可能避免使用自定义 Headers ,因为这些仍会触发预检 . 如果您的API返回JSON,请注意“application / json”的Content-Type也会触发预检 .

    如果你愿意弯曲你的API是如何“RESTful”的,那么你可以尝试更多的东西 . 一种是使用不需要预检的Content-Type,例如'text / plain' . 自定义 Headers 始终会触发预检,因此如果您有任何自定义 Headers ,则可以将它们移动到查询参数中 . 在最后,您可以使用JSON-RPC之类的协议,其中所有请求都发送到单个 endpoints .

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

  • 4

    尝试使用xDomain

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

    https://github.com/jpillora/xdomain

  • -2

    一种方法是,您可以将所有API调用指向与前端相同的域 . 在前端服务器上设置nginx,仅将API调用转发给API服务器 . 这将删除所有转机前电话 .

相关问题