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

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

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

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

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

这个时间间隔是多少?

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

浏览器之间在实现飞行前缓存方面存在差异。 不幸的是,单凭W3C规范并没有解释你在飞行前缓存中观察到的细微差别。

对于阅读此问题的其他人,我想解释OP何时说出飞行前请求他指的是跨越原始POST请求之前的OPTIONS请求。 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 

由于您使用的是谷歌浏览器 ,我将向您推荐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分钟。

回答你的问题:

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

您需要在对OPTIONS请求的API响应的标头中将Access-Control-Max-Age为600

这个时间间隔是多少?

对于Webkit浏览器(即Google Chrome),默认超时值为5秒 。 这就是您在每个POST请求之前看到飞行前请求的原因,但是如果您快速提交POST请求,那么您将看不到其他的飞行前请求。

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

是的 ,浏览器之间在如何实施飞行前缓存方面存在差异。 W3C规范没有规定在Web浏览器中构建飞行前缓存function所需的一切。

如果满足以下两种情况,浏览器将不会发出预检请求:

  • 对于请求方法,有一个方法缓存匹配或它是一个简单的方法,并且强制预检标志未设置。
  • 对于作者请求标头的每个标头,可以是字段名称的标头高速缓存匹配,也可以是简单的标头。

此参考资料显示了CORS的用户代理(浏览器)职责: http : //www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

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