跨域简介
原因:浏览器的同源策略,是针对Ajax的。
同源:
- 协议
- 域名
- 端口
只有当3个都相同时,才是同源合法,否则浏览器就会禁止Ajax访问。
注意:<img>、<script>等标签的“src”属性不会触发浏览器的同源策略。
CORS的原理
h5的一个规范
CORS 请求分为两种类型:简单请求和预检请求。简单请求可以直接发出。预检请求(option请求)必须先向服务器发送初步“预检”请求以获得许可,然后才可以继续发出主请求。如果满足以下任何一种情况,系统将对请求执行预检:
- 请求使用的是
GET、HEAD或POST以外的方法。 - 请求使用
POST方法且Content-Type不是text/plain、application/x-www-form-urlencoded或multipart/form-data。 - 请求设置了自定义标头,例如
X-PINGOTHER。
简单请求过程
- 浏览器将
Origin标头添加到请求中。Origin标头包含相应资源的来源,例如Origin:https://www.example.appspot.com。 - 服务器将请求的 HTTP 方法以及
Origin标头的值与 CORS 配置中的方法和来源信息进行比较,以查看是否存在匹配项。如果存在匹配项,服务器将在响应中包含Access-Control-Allow-Origin标头。Access-Control-Allow-Origin标头包含初始请求的Origin标头的值。 - 浏览器接收响应并检查
Access-Control-Allow-Origin值是否与原始请求中指定的网域匹配。如果它们匹配,则请求成功。如果它们不匹配,或者响应中不存在Access-Control-Allow-Origin标头,则请求失败。
预检请求过程
- 浏览器发送一个
OPTIONS请求(包含主请求的Requested Method和Requested Headers)。 - 服务器使用允许的 HTTP 方法和header的值进行响应。如果预检请求中的任何方法或header值未包含在响应允许的方法和标头集合中,请求将失败,并且不会发送主请求。
注意
- 必须域名和ip不能交叉使用:如访问页面使用域名,页面中的ajax访问接口使用ip,也会失败。就算某个主机有多个ip,也必须使用同一个ip。
- 请求方法和一些header也必须要在服务器cors中配置:如有使用自定的header。
欢迎大家留言指点讨论。。。