Skip to content

什么是跨域,有哪些解决方案

域名、协议、端口,有一个不同,发送的请求就算跨域

1. CORS

  1. 简称 CORS 是 W3C 标准,它允许浏览器向跨源服务器发送请求(域名协议端口有不相同的服务器,都算跨源)

  2. 浏览器将 CORS 分为两类:简单请求 和 非简单请求

  • 简单请求

    • 请求方法:HEAD、GET、POST
  • 非简单请求

    • 会发送预检请求
    • 预检请求的请求方法是 OPTIONS
    • Content-Type:application/json 都是非简单请求
  • 请求时会携带 origin 头字段

  • 简单请求头信息不超出以下字段

    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值 application/x-www-form-urlencoded、multipart/form-data、text/plain
  1. 后端关于响应头返回
  • Access-Control-Allow-Origin: http://api.bob.com

    允许请求的源

  • Access-Control-Allow-Credentials: true

    允许请求携带 cookie, xhr.withCredentials = true; 可以设置

  • Access-Control-Request-Methods: POST, GET

    允许请求的方法

  • Access-Control-Expose-Headers: FooBar

    允许前端获取的响应头字段

  • Access-Control-Max-Age: 3000

    控制预检请求缓存时间,不用每次都预检

2. jsonp

JSONP 优点是简单兼容性好,可用于解决主流浏览器的跨域数据访问的问题。缺点是仅支持get方法具有局限性

实现方案:

  • 声明一个回调函数
  • 创建一个<script>标签,把那个跨域的 API 数据接口地址,赋值给 script 的 src,还要在这个地址中向服务器传递该函数名(可以通过问号传参:?callback=show)
  • 服务器接收到请求后,需要进行特殊的处理:把传递进来的函数名和它需要给你的数据拼接成一个字符串, 例如 callback(data)
  • 客户端获取到callback(data)这段脚本,最后执行 callback

3. 代理服务

通过 nginx 或 node 服务转发请求

4. iframe

5. postMessage

参考

跨域资源共享 CORS 详解