跨域小计

109 阅读2分钟

跨域简介

原因:浏览器的同源策略,是针对Ajax的。

同源:

  • 协议
  • 域名
  • 端口

只有当3个都相同时,才是同源合法,否则浏览器就会禁止Ajax访问。

注意:<img>、<script>等标签的“src”属性不会触发浏览器的同源策略。

CORS的原理

h5的一个规范

CORS 请求分为两种类型:简单请求和预检请求。简单请求可以直接发出。预检请求(option请求)必须先向服务器发送初步“预检”请求以获得许可,然后才可以继续发出主请求。如果满足以下任何一种情况,系统将对请求执行预检:

  • 请求使用的是 GETHEADPOST 以外的方法。
  • 请求使用 POST 方法且 Content-Type 不是 text/plainapplication/x-www-form-urlencodedmultipart/form-data
  • 请求设置了自定义标头,例如 X-PINGOTHER

简单请求过程

  1. 浏览器将 Origin 标头添加到请求中。Origin 标头包含相应资源的来源,例如 Origin:https://www.example.appspot.com
  2. 服务器将请求的 HTTP 方法以及 Origin 标头的值与 CORS 配置中的方法来源信息进行比较,以查看是否存在匹配项。如果存在匹配项,服务器将在响应中包含 Access-Control-Allow-Origin 标头。Access-Control-Allow-Origin 标头包含初始请求的 Origin 标头的值。
  3. 浏览器接收响应并检查 Access-Control-Allow-Origin 值是否与原始请求中指定的网域匹配。如果它们匹配,则请求成功。如果它们不匹配,或者响应中不存在 Access-Control-Allow-Origin 标头,则请求失败。

预检请求过程

  1. 浏览器发送一个 OPTIONS 请求(包含主请求的 Requested MethodRequested Headers)。
  2. 服务器使用允许的 HTTP 方法和header的值进行响应。如果预检请求中的任何方法或header值未包含在响应允许的方法和标头集合中,请求将失败,并且不会发送主请求。

注意

  • 必须域名和ip不能交叉使用:如访问页面使用域名,页面中的ajax访问接口使用ip,也会失败。就算某个主机有多个ip,也必须使用同一个ip。
  • 请求方法和一些header也必须要在服务器cors中配置:如有使用自定的header。

欢迎大家留言指点讨论。。。