跨域访问分为两种:

  1. 简单请求
  2. 简单请求以外的其他请求

    简单请求

  3. GET/HEAD/POST方法之一

  4. 头部仅包含:
    1. Accept
    2. Accept-Language
    3. Content-Language
    4. Content-Type
  5. Cotnent-type的值只能是:
    1. text/plain
    2. multipart/form-data
    3. application/x-www-form-urlencoded

简单请求的交互:

  1. 请求中携带Origin头部告知来自哪个域
  2. 服务端设置Access-Control-Allow-Origin即可

    复杂请求

    访问资源前需要先发起preflight预检请求(方法为options)询问何种请求是被允许的

复杂请求的交互:

  1. 先发起预检请求
    1. 请求头中带上
      1. Access-Control-Request-Method
      2. Access-Control-Request-Headers
    2. 响应头中返回
      1. Access-Control-Allow-Method
      2. Access-Control-Allow-Headers
      3. Access-Control-Max-Age
  2. 预检请求通过之后,再发起正式请求
    1. 请求头部跟预检请求差不多,再加一个Origin
    2. 响应头中返回
      1. Access-Control-Allow-Origin
      2. Access-Control-Allow-Headers
      3. Access-Control-Allow-Method
      4. Access-Control-Expose-Headers
      5. Access-Control-Allow-Credentials
      6. Access-Control-Max-Age

可以发现预检请求主要是检查请求方法请求头是否合法,合法才发起正式请求