同源策略

两个 URL 具有相同的协议域名端口,则称它们是“同源”的。
以下的几个 URL 都是同源的:

(http的默认端口是 80, https 的默认端口是 443)

但是下面这几个不是:

请求不同源的数据即为跨域, 实现跨域的方式有 JSONP 和 CORS

JSONP

下面三个标签可无视同源策略

  1. <img src="" />
  2. <link href="" />
  3. <script src=""><script>

JSONP利用script标签可以无视同源策略的特性,在src中以参数形式将前端写好的回调函数传给后台,后台将数据传给回调函数,浏览器收到请求的JS文件后就会立即执行,从而获得需要的数据

JSONP的缺点:

  • 只能发送 GET 请求
  • 请求过程无法终止,弱网络条件下容易请求超时
  • 拿不到状态码,无法捕获异常

CORS

CORS是跨源资源共享(Cross-Origin Resource Sharing)
对于简单请求,后台在响应头里添加 Access-Control-Allow-Origin: http://站点 即可。

对于复杂请求,如 PATCH,后台需要:

  • 响应 OPTIONS 请求,在响应中添加如下的响应头
    • Access-Control-Allow-Origin: https://站点
    • Access-Control-Allow-Methods: POST, GET, OPTIONS, PATCH
    • Access-Control-Allow-Headers: Content-Type
  • 响应 POST 请求,在响应中添加 Access-Control-Allow-Origin 头。
  • 如果需要附带身份信息,JS 中需要在 AJAX 里设置 xhr.withCredentials = true 。

参考文章