我正在使用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分钟.
回答你的问题:
How can I avoid this pre flight request every time?
您需要在对OPTIONS请求的API响应的标头中将Access-Control-Max-Age设置为600.
What is this time interval?
对于Webkit浏览器(即Google Chrome),默认超时值为5秒.这就是您在每个POST请求之前看到飞行前请求的原因,但是如果您快速提交POST请求,那么您将看不到其他的飞行前请求.
Is this something specific to Chrome browser?
是的,浏览器之间在实施飞行前缓存方面存在差异. W3C规范没有规定在Web浏览器中构建飞行前缓存功能所需的一切.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。