我正在构建一个使用CORS的REST应用程序.每个REST调用都是不同的,我发现获得预检OPTIONS调用会有很大的开销.有没有办法缓存并应用预检OPTIONS结果,以便对同一域的任何后续调用都使用缓存的响应?
mon*_*sur 99
预检只能应用于请求,而不能应用于整个域.我在邮件列表上提出了同样的问题,并且存在安全问题.这是整个主题: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规范的作者将来会尝试解决这个问题.
尝试使用xDomain
对于我来说,使用angular或jQuery进行设置非常简单。在您的应用服务器上,按照以下链接中的帮助所述添加proxy.html。在您的“客户端”和中提琴上添加一些引用js文件的标签,不再需要进行预检。它将包装在iframe中,以避免需要进行cors检查。
https://github.com/jpillora/xdomain
| 归档时间: |
|
| 查看次数: |
23905 次 |
| 最近记录: |