CORS

Access-Control-Allow-Origin【控制是否允许浏览器交付返回数据给ajax】

前端发出的请求如果是附带身份验证(withCredentials:true)而后端的Access-Control-Allow-Origin如果设置的是*那么这个请求会失败,在Options预请求时会被拦截下来。
with-credentials=”true” ajax 告诉 浏览器 控制是否发送cookie
Access-Control-Allow-Credentials 服务器告诉 浏览器 是否允许返回给ajax(默认不允许)

Access-Control-Allow-Credentials: true【控制浏览器是否允许with-credentials=”true”请求的数据交付给ajax】

这个是服务端返回数据时携带的头,浏览器接受数据发现ajax请求有 Credentials,返回头没有Credentials,就禁止返回给ajax,ajax获取不到数据。

如果设置Acces-Control-Allow-Origin为*(任何域),则Access-Control-Allow-Credentials头不能设置为true
也就是:

  • 当携带cookie 时,Acces-Control-Allow-Origin 不能为* 号

这样就是所有的ajax都可以【携带本地cookie】访问服务器。浏览器会拒绝。

仅仅access-control-allow-origin * 所有域名下ajax都可以【不携带cookie,with-credentials=”false”】访问服务器,接收返回数据。

Access-Control-Allow-Headers

如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的

非简单请求

跨域 - 图1

非简单请求的预检命令

非简单请求,会有“预检命令”
跨域 - 图2
预检命令会发送 content-type method,看服务器是否支持此类型跨域。
跨域 - 图3
预检Access-Control-Request-Headers:content-type,所以response的Access-Control-Allow-Headers也要有content-type。

跨域 - 图4

Access-Control-Max-Age

预检命令缓存时间