Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CORS飞行前响应实际上是如何缓存在浏览器中的?_Cors - Fatal编程技术网

CORS飞行前响应实际上是如何缓存在浏览器中的?

CORS飞行前响应实际上是如何缓存在浏览器中的?,cors,Cors,这是一个高度技术性的问题,可能只有了解浏览器内部结构的人才能回答 浏览器缓存CORS飞行前响应的具体方式(假设在对选项飞行前请求的响应中返回了Access Control Max Age响应头) 基本上,在spec()中,它表示飞行前结果缓存中的每个条目都包含以下字段: 起源 网址 最大年龄 证书 方法 标题 (方法和头是互斥的) 主缓存密钥由除“最大年龄”之外的所有字段组成 因此,如果我收到对选项飞行前请求的响应,其中包含以下内容: Access-Control-Allow-Origin:

这是一个高度技术性的问题,可能只有了解浏览器内部结构的人才能回答

浏览器缓存CORS飞行前响应的具体方式(假设在对选项飞行前请求的响应中返回了Access Control Max Age响应头)

基本上,在spec()中,它表示飞行前结果缓存中的每个条目都包含以下字段:

  • 起源
  • 网址
  • 最大年龄
  • 证书
  • 方法
  • 标题
(方法和头是互斥的)

主缓存密钥由除“最大年龄”之外的所有字段组成

因此,如果我收到对选项飞行前请求的响应,其中包含以下内容:

Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, OPTION, HEAD
Access-Control-Allow-Headers: x-cool, x-special, x-sweet
Access-Control-Max-Age: 3600
那么,我认为这会导致所有以下条目被添加到飞行前缓存中,对吗

http://www.example.com  <url>  3600  true  GET
http://www.example.com  <url>  3600  true  POST
http://www.example.com  <url>  3600  true  OPTIONS
http://www.example.com  <url>  3600  true  HEAD
http://www.example.com  <url>  3600  true           x-cool
http://www.example.com  <url>  3600  true           x-special
http://www.example.com  <url>  3600  true           x-sweet
http://www.example.com    3600真人秀
http://www.example.com    3600真柱
http://www.example.com    3600个真实选项
http://www.example.com    3600真头
http://www.example.com    3600真x-酷
http://www.example.com    3600真x-special
http://www.example.com    3600真x-甜
我的问题是:

  • 如果这是真的,这是否意味着(从性能角度来看)最好在选项调用中返回所有可能允许的方法,以便立即将它们添加到缓存中)。这与仅返回在访问控制请求方法请求头中传递的实际方法形成对比。还是说性能优势微不足道,甚至不值得问这个问题:)
  • 是否存在任何最大缓存大小
  • 有人知道为什么源代码和url区分大小写吗
  • FWIW,我希望我可以指定访问控制允许标头:(这意味着我的源服务器允许所有标头与实际请求一起传递给它)。同样,能够指定访问控制公开标题:也不错,因此我不需要为每个标题确定是否需要将其公开给客户端JS。因为它们无论如何都会在响应中传递,所以不能公开它们是有点毫无意义的——确保发出CORS请求的JS看不到它们,但这并不是说它们对技术知识模糊的最终用户是隐藏的——任何使用控制台、Fiddler或Charles的人都可以看到它们

    更新:我与Chrome的一位开发人员进行了交谈,他确认无法查看CORS缓存(至少在Chrome中)

    更新2:访问控制允许标头:
    访问控制公开标头:已添加到获取规范中!耶!没有说明每个浏览器的哪个版本(如果有)支持它们

    FWIW,我希望我可以指定访问控制允许标头:* (这意味着我的源服务器允许使用 实际请求)。同样,能够指定 访问控制公开标头:*


    一种可能的解决方法是收集所有的头键,并在Access Control Expose header中返回这些头键。

    执行Access Control Allow header非常简单(因为我可以镜像回Access Control Request Headers值,从而允许在请求中传递的所有头)。然而,要返回访问控制暴露头,我需要知道GET可能返回的所有可能的响应头。如果处理GET的代码与返回选项响应的代码相同,那么没关系,但这意味着我不能使用中间代理(例如CDN或负载平衡器)来返回它们,因为它们不知道响应头可能是什么