浏览器之间实现飞行前缓存的方式存在差异。不幸的是,W3C 规范本身并不能解释您在飞行前缓存中观察到的细微差别。
对于其他阅读这个问题的人,我想解释一下OP说的内容飞行前请求他指的是OPTIONS
跨域之前的请求POST
要求。这OPTIONS
request 用于查询 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 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 分钟。
回答您的问题:
如何避免每次都出现这种飞行前请求?
你需要set Access-Control-Max-Age
to 600在 API 响应的标头中OPTIONS
要求。
这个时间间隔是多少?
对于 Webkit 浏览器(即 Google Chrome),默认超时值为5秒。这就是为什么您会在每个 POST 请求之前看到预检请求,但如果您快速提交 POST 请求,则不会看到其他预检请求。
这是 Chrome 浏览器特有的吗?
Yes,浏览器之间在飞行前缓存的实现方式上存在差异。 W3C 规范并未指定在 Web 浏览器中构建飞行前缓存功能所需的所有内容。