跨域资源共享 CORS 详解
- CORS 需要浏览器和服务器 同时支持,目前所有浏览器都支持该功能(除IE10以下版本),浏览器将CORS请求分成两类:简单请求 和 非简单请求。
1.两种请求
-
简单请求: 只要满足以下两大条件,就属于简单请求。
(1).基本流程:- 当发送请求时,浏览器会判断 是 简单请求 还是 非简单请求 , 当为 简单请求时 就会在 request (请求头)headers 上自动加上 Origin 字段。
这个字段 用于 说明 本次请求 来自 哪个 源 (协议 + 域名 + 端口(默认为 80)),服务器 根据这个值判断 是否在 服务器 响应头(response headers) Access-Control-Allow-Origin 字段 指定的 范围内,如果在 则 请求成功,不在则会抛出 一个 跨域 请求 错误。
-
如果Origin 在指定的 许可范围内,服务器响应头会多出几个字段:
(1).Access-Control-Allow-Origin:(必需)
这个字段,表明 服务端 接受 哪些 域名 请求, 设置为 * 表示 所有
(2).Access-Control-Allow-Credentials:(可选)
这个 字段 表示 是否允许 发送 cookie, true 允许 cookie包含在 请求中 , 若不允许的 话 直接 删除该字段即可。
(3).Access-Control-Expose-Headers:(可选)
- 非简单请求:
除简单请求 之外的请求。
(1).基本流程:
非简单请求 在 与 服务器 正式 通信 之前 会 先 发送 一个 预请求 ,这个 请求 的 头部信息(request headers) 会有 Origin 和 Access-Control-Request-Method.
Access-Control-Request-Method 表示 本次 请求 使用的 方法
服务器 会 检测 Origin 是否在 服务器 标明的 Access-Control-Allow-Origin 字段 指定 的范围内,Access-Control-Request-Method 是否 在 服务器 标明的Access-Control-Allow-Methods字段 指示的方法内,若都符合 则 会 进行 真正的 请求。
(2). 服务器回应的其他CORS相关字段如下:
- Access-Control-Max-Age: 该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求
与JSONP的比较
(1).JSONP 只支持 GET 请求 CORS 支持所有 请求
(2).JSONP 支持 所有 老式浏览器 而 CORS 必须是IE9以上的 浏览器才支持