HTTP访问控制(跨域问题)

若如初见. 提交于 2020-03-12 11:25:09

跨域资源共享(CORS)

  • 跨域资源共享(CORS) 使用额外的 HTTP 头来告诉浏览器,让运行在一个origin域上的Web应用被准许访问来自不同源服务器上的指定的资源
    • 主要是为了保护服务端资源
  • 浏览器本地缓存也会受到跨域限制
    • cookie、storage、indexDB等
      在这里插入图片描述
  • 跨域指不同的域名,协议或端口
    • 例如http和https就是不同协议,从http协议的地址向同一域名下https协议的地址请求会产生跨域
      在这里插入图片描述在这里插入图片描述
  • 整个CORS通信过程,都是浏览器自动完成,不需要用户参与
    • 浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求
    • 因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信
  • 如果请求的Origin的值不在指定的许可范围,服务端返回一个正常的HTTP回应,但这个回应的头信息没有包含Access-Control-Allow-Origin字段
    • 此时浏览器就知道跨域请求失败了
    • 这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200
  • 同源策略只是浏览器的一个安全策略,只适用于浏览器向服务器发送请求的时候
    • 服务器跟服务器发送请求的时候,自然就没有这么一层限制
      在这里插入图片描述

跨域通信过程

  • 对那些可能对服务器数据产生副作用的非简单请求方法,浏览器必须首先使用 OPTIONS 方法发起一个预检请求
    • 从而获知服务端是否允许该跨域请求,服务器确认允许之后,才发起实际的 HTTP 请求
    • 简单请求:
      • 请求方法为HEADGET或者POST中的一种
      • HTTP的头信息不超过以下几种字段AcceptAccept-LanguageContent-Language
      • Content-Type的值只限于application/x-www-form-urlencodedmultipart/form-datatext/plain三个
        • 经常使用的application/json就不是简单请求
  • 请求首部字段
    • Origin 表明该请求来源,即请求发起的域名
    • 对于预检请求的头信息,必须包括两个特殊字段
      • Access-Control-Request-Method
        • 列出浏览器的CORS请求会用到哪些HTTP方法
      • Access-Control-Request-Headers
        • 一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段
  • 响应首部字段
    • Access-Control-Allow-Origin
      • 表明该资源被允许访问的域名,只能是单个域名或者*
        • 逗号分隔多个域名是行不通
        • 但可以先获取请求origin进行判断,判断成功后把origin写入该字段的方式规避限制
      • *表明该资源可以被任意外域访问
      • 正确响应的值应当为 * 或者包含由 Origin 首部字段所指明的域名
    • Access-Control-Allow-Headers
      • 表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段
      • 它也是一个逗号分隔的字符串,是必须的
    • Access-Control-Allow-Methods
        • 表明服务器支持的所有跨域请求的方法, 同样不限于浏览器在"预检"中请求的字段
      • 该字段必需,它的值是逗号分隔的一个字符串
    • Access-Control-Allow-Credentials
      • 表明是否允许请求时携带Cookie
      • 如果要发送Cookie,Access-Control-Allow-Origin不能设为星号,必须指定明确的、与请求网页一致的域名
        • 主要是为了Cookie安全
    • Access-Control-Max-Age
      • 该字段可选,用来指定本次预检请求的有效期
      • 允许缓存该条回应,在此期间,不用发出另一条预检请求

参考

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!