近日手中有一个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)请求。