我正在将WebApp和其API托管在不同的域上,并使用CORS以便绕过同源策略。到目前为止,一切都很好。这个可以工作。
为了每个会话仅发送一次CORS预检请求,我将Access-Control-Max-Age设置为20天,但这并没有起作用(在Chrome中测试):https://db.tt/vfIW3fD2
我需要做出什么改变?
我正在将WebApp和其API托管在不同的域上,并使用CORS以便绕过同源策略。到目前为止,一切都很好。这个可以工作。
为了每个会话仅发送一次CORS预检请求,我将Access-Control-Max-Age设置为20天,但这并没有起作用(在Chrome中测试):https://db.tt/vfIW3fD2
我需要做出什么改变?
Chrome/Blink实施了一个最大预检时间为10分钟(600秒)的限制。以下是定义此限制的源代码位置:
超过10分钟的任何预检时间都将被忽略,而将使用10分钟。
不同的浏览器可能有不同的“最大年龄”策略。Safari/WebKit缓存长达5分钟,而Firefox缓存长达24小时。Chrome源代码表明,该最大值存在是为了“在切换到安全网络后最小化使用受污染的缓存的风险”。
如果代码无法解析max-age标头(或服务器未指定max-age标头),则浏览器默认为5秒。
我不会过分依赖预检测缓存。
从规范来看:
用户代理在max-age字段指定的时间之前可能会清除缓存条目。
此外,请记住以下内容(来自CORS规范):
当预检结果缓存中存在缓存条目并满足以下条件时,就会出现缓存匹配:
源操作值对大小写敏感匹配源来源。
url字段值对大小写敏感匹配请求URL。
凭据字段值为true且省略凭据标志未设置,或者它为false并且省略凭据标志已设置。
您的屏幕截图无法确定上述任何一项是否为真。
withCredentials
不等于true,则设置省略凭据标志。凭据字段值是指可能存在或不存在于服务器响应中的Access-Control-Allow-Credentials头。换句话说,如果已发送并缓存了另一个类似的预检请求,但预检缓存中的匹配包括cookie而响应中没有Access-Control-Allow-Credentials=true,或者请求中未包含cookie但响应中包含Access-Control-Allow-Credentials=true,则不会查询预检缓存。 - Ray Nicholus