使用jquery ajax的两个CORS请求之间的时间间隔

时间:2014-09-04 19:11:52

标签: javascript jquery ajax google-chrome http

我正在使用jQuery $.ajax向Web服务发出CORS请求。根据标准,有一个飞行前请求,然后是实际的POST请求。

我注意到的是,每次尝试进行Web服务调用时都会有两个请求(一个在飞行前和一个实际的POST请求)。如果两个请求之间有一个时间间隔。

如果我继续连续进行网络服务呼叫而没有任何时间间隔(例如两次请求之间不到1秒),那么飞行前就会丢失。

我怎样才能每次都避免这个飞行前请求?

这个时间间隔是多少?

这是Chrome浏览器特有的内容吗?

2 个答案:

答案 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 源代码的适用部分:

https://github.com/WebKit/webkit/blob/master/Source/WebCore/loader/CrossOriginPreflightResultCache.cpp

默认的飞行前缓存超时为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

否则,你不应该担心它。浏览器实现将做正确的事。