cors - CORS 预检响应如何实际缓存在浏览器中?

标签 cors

一个技术性很强的问题,可能只有了解浏览器内部结构的人才能回答......

浏览器缓存 CORS 预检响应的准确程度如何(假设在对 OPTIONS 预检请求的响应中返回了 Access-Control-Max-Age 响应 header )?

基本上,在规范( https://www.w3.org/TR/cors/#preflight-result-cache-0 )中,它说预检结果缓存中的每个条目都包含以下字段:

  • 产地
  • 网址
  • 最大年龄
  • 凭据
  • 方法
  • 标题

  • (方法和头是互斥的)

    主缓存键由除 max-age 之外的所有字段组成。

    因此,如果我收到对包含以下内容的 OPTIONS 预检请求的响应:
    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
    

    我的问题是:
  • 如果这是真的,这是否意味着(从性能 POV 来看)在 OPTIONS 调用中返回所有可能的允许方法更好,因此它们会立即添加到缓存中)。这与仅返回在 Access-Control-Request-Method 请求 header 中传递的实际方法相反。或者性能优势是如此微不足道,以至于根本不值得问这个问题:)
  • 是否有最大缓存大小?
  • 有谁知道为什么 origin 和 url 区分大小写?

  • <咆哮>

    FWIW,我愿望我可以指定 访问控制允许标题:* (这意味着我的源服务器允许将所有 header 与实际请求一起传递给它)。同样,可以指定 访问控制公开标题:* 会很好,所以我不需要为每个人弄清楚是否需要将它公开给客户端 JS。由于无论如何它们都会在响应中传递,因此无法公开它们是毫无意义的 - 确保发出 CORS 请求的 JS 无法看到它们,但这并不是说它们对技术知识模糊的最终用户隐藏- 任何使用控制台或 Fiddler 或 Charles 的人都可以看到它们。



    叹。

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

    更新 2:两者 访问控制允许标题:* 访问控制公开标题:* 已添加到获取规范中!好极了!没有关于每个浏览器的哪个版本(如果有)支持它们的消息。

    最佳答案

    FWIW, I wish that I could specify Access-Control-Allow-Headers: * (meaning that my origin server allows all headers passed to it with the actual request). Likewise, being able to specify Access-Control-Expose-Headers: *



    一个可能的解决方法是收集所有 header 键并在 Access-Control-Expose-Headers 中返回它。

    关于cors - CORS 预检响应如何实际缓存在浏览器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36069984/

    相关文章:

    javascript - 如何在没有身份验证页面的情况下将网络表单直接发布到 Google 表格?

    azure - Azure 搜索上的 CORS 问题

    amazon-s3 - CORS、Amazon S3 和 Rails - 在 IE 10 和 Safari 上失败

    local-storage - 使用 CORS 从不同域访问 IndexedDB?

    nginx - 如何阻止其他网页从我的服务器下载媒体?

    javascript - 如何发出 CORS 请求

    javascript - 当跟进请求的答案是 204 时,为什么 OPTIONS 请求会失败?

    java - 在 Spring Boot 中全局启用 CORS

    twitter-bootstrap - 没有 'Access-Control-Allow-Origin' 错误,但图像已渲染

    ajax - 当请求的 Origin header 存在时,AWS S3 不发送 Access-Control-Allow-Origin header