Appearance
什么是跨域,有哪些解决方案
域名、协议、端口,有一个不同,发送的请求就算跨域
1. CORS
简称
CORS
是 W3C 标准,它允许浏览器向跨源服务器发送请求(域名协议端口有不相同的服务器,都算跨源)浏览器将
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
- 后端关于响应头返回
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 服务转发请求