记VUE解决跨域请求的过程

281 阅读2分钟

近日手中有一个VUE的开发项目,遇到了跨域请求问题,本地开发环境通过代理设置解决了,但是发布到线上的环境却始终没有解决跨域问题,经过摸索找到了问题所在,现在整理一下,供遇到同样问题的同学可以参考。

基本知识

CORS跨域分为 简单跨域请求复杂跨域请求

简单跨域

简单跨域不会发送options请求,复杂跨域会发送一个预检请求options,简单跨域满足的条件:

  • 请求方式是以下三种之一:
HEAD
GET
POST
  • HTTP的头信息不超出以下几种字段
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type
  • Content-Type的值,只限于以下三个值
application/x-www-form-urlencoded
multipart/form-data
text/plain

复杂跨域满足的条件

  • 请求方法不是GET/HEAD/POST
  • post请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
  • 请求设置了自定义的header字段

在header中自定义了字段就会触发options预检请求,所以在开发时同学们一定要认真检查一下是否满足了上面的情况,下面是我的代码

axios.defaults.timeout = 50000
axios.defaults.baseURL = process.env.VUE_APP_URL
axios.defaults.withCredentials = true // 定义此处会触发options预检请求

去除axios.defaults.withCredentials = true后跨域问题解决,

登录之后的请求会带登录用户信息,需要把登录时的cookie设置到之后的请求头里面。而跨域请求要想带上cookie,
必须要请求属性withCredentials=true,这是浏览器的同源策略导致的问题:不允许JS访问跨域的Cookie。

withCredentials 属性是一个Boolean类型,它指示了是否该使用类似cookies,authorization,headers(头部授
权)或者TLS客户端证书这一类资格证书来创建一个跨站点访问控制(cross-site Access-Control)请求。