我正在使用jQuery $.ajax
向Web服务发出CORS请求。根据标准,有一个飞行前请求,然后是实际的POST请求。
我注意到的是,每次尝试进行Web服务调用时都会有两个请求(一个在飞行前和一个实际的POST请求)。如果两个请求之间有一个时间间隔。
如果我继续连续进行网络服务呼叫而没有任何时间间隔(例如两次请求之间不到1秒),那么飞行前就会丢失。
我怎样才能每次都避免这个飞行前请求?
这个时间间隔是多少?
这是Chrome浏览器特有的内容吗?
答案 0 :(得分:6)
浏览器之间在实施飞行前缓存方面存在差异。不幸的是,单凭W3C规范并没有解释你在飞行前缓存中观察到的细微差别。
对于其他人在阅读这个问题时,我想解释OP何时说飞行前请求他指的是跨越OPTIONS
之前的POST
请求请求。 OPTIONS
请求用于查询API并确定跨源请求允许哪些HTTP方法。通常,您希望看到OPTIONS
请求的此类响应:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, X-Requested-With
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT
由于您使用的是 Google Chrome ,因此我将向您推荐 Webkit 源代码的适用部分:
默认的飞行前缓存超时为5秒:
static const auto defaultPreflightCacheTimeout = std::chrono::seconds(5);
最大值为5分钟:
static const auto maxPreflightCacheTimeout = std::chrono::seconds(600);
服务器可以使用响应标头中的 Access-Control-Max-Age
字段为航班前请求指定超时值,但 Webkit浏览器强制执行最大超时 5分钟。
回答你的问题:
我怎样才能每次都避免这个飞行前请求?
您需要在对Access-Control-Max-Age
请求的API响应标头中将OPTIONS
设置为600 。
这个时间间隔是多少?
对于Webkit浏览器(即Google Chrome),默认超时值 5秒。这就是为什么你在每个POST请求之前看到飞行前请求的原因,但是如果你快速提交POST请求,那么你就不会看到其他的飞行前请求。
这是Chrome浏览器特有的内容吗?
是,浏览器之间在实施预飞行缓存方面存在差异。 W3C规范没有规定在Web浏览器中构建飞行前缓存功能所需的一切。
答案 1 :(得分:2)
如果满足以下两种情况,浏览器将不会发出预检请求:
此参考显示CORS的用户代理(浏览器)职责:http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0
否则,你不应该担心它。浏览器实现将做正确的事。