三种方法教你解决跨域请求?

98 阅读1分钟

解决方案一: jsonp

  • 缺点:只能解决get请求.比如:文件上传formData
  • 原理:动态创建script标签 添加src属性(但是这个请求是异步的)需要在页面上声明了一个函数.服务器端返会的是函数调用 1.在浏览器端:

首先全局注册一个callback回调函数,记住这个函数名字(比如:result),这个函数接收一个参数,参数是服务端返回的数据,函数的具体内容时处理这个数据。

然后动态生成一个script标签,src为:请求资源的地址 + 获取函数的字段名 + 回调函数名,这里 获取函数字段名是要和服务端约定好的,是为了让服务端拿到回调函数名称。(

function result (data) {
  console.log(data.name)
}
var jsonp = document.createElement('script')
jsonp.src = 'www.example.com?callbackName=result'
document.getElementsByTagName('head')[0].appendChild(jsonp)

2.服务端

在接收到浏览器端script的请求之后,从url的query的callbackName获取到回调函数的名字,例子中是 result。

然后动态生成一段js片段去给这个函数传入参数执行这个函数。比如:

result({name:'Joy'})

解决方案二: cors

  • 原理:在响应头中添加键值对,Access.Control-Allow-Origin:* 解决方案三:反向代理
  • 原理:是服务器与服务器之间进行数据通讯 在vue.config.js里面自己配置一个proxy 如果路径中包含/api就会走代理服务器.如果不包含则需要路径重写

image.png