使用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源代码的适用部分:
默认的飞行前缓存超时为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
否则,你不应该担心它。 浏览器实现将做正确的事情。