axios设置withCredentials导致“跨域”的解决方案

前两天调接口的时候,出现了一个从来没遇到过的问题。从报错来看,像是跨域:

Access to XMLHttpRequest at '...' from origin '...' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

但是一般来说跨域的报错并不是这样,一般是类似于缺少Access-Control-Allow-Origin header的报错。

因为我用的是Vue,就先在vue.config.js的devServer options里配置了proxy,但是没什么效果;后来配置了nginx进行转发,仍然是这个报错,甚至一度让我怀疑我的nginx配置……当然事实上是没错的。而且,我问过后端之后,听说已经配置了cors,按理说不应该报错,这就让我感觉更神秘了。

回去查了一遍代码,发现我在axios里设置了withCredentials: true。看到网上有人这么说:

withCredentials的情况下,后端要设置Access-Control-Allow-Origin为你的源地址,例如http://localhost:8080,不能是*,而且还要设置header(‘Access-Control-Allow-Credentials: true’);

说白了就是后端没允许cookie过去……

另外,Access-Control-Allow-Origin设置为*时cookie不会出现在http的请求头里,所以报错里说Access-Control-Allow-Origin不能是*也是有道理的。

此外还有一个问题,OPTIONS请求无法通过。我们知道,OPTIONS请求是因为前端发送了“非简单请求”,比如Content-Type: 'application/json',如果后端失误(或者根本不知道有OPTIONS这种请求),就有可能把OPTIONS挡住,导致无法通过。在不修改后端的情况下,也是有办法解决这个问题的,就是调整Content-Type: 'application/x-www-form-urlencoded',同时将传输的JSON进行一次序列化(可以用querystring进行转换),这样也能解决问题。

参考资料
  1. 不要再问我跨域的问题了
  2. 踩坑记录-前端请求如果携带Cookie信息,那么后端Access-Control-Allow-Origin不能为*
  • 26
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Vue中使用axios发送GET请求解决跨域问题,可以通过以下步骤: 1. 安装axios:在命令行中运行 `npm install axios` 或者 `yarn add axios`,安装axios库。 2. 在Vue组件中引入axios:在需要使用axios的组件中,可以通过import语句引入axios。 ```javascript import axios from 'axios'; ``` 3. 发送GET请求:使用axios的get方法发送GET请求,并设置`Access-Control-Allow-Origin`头部字段。 ```javascript axios.get('http://api.example.com/data', { headers: { 'Access-Control-Allow-Origin': '*' } }).then(response => { // 处理响应数据 }).catch(error => { // 错误处理 }); ``` 解释:跨域请求是指在浏览器上从一个域名的网页向另一个域名的服务器发送请求。由于浏览器的同源策略限制,普通的Ajax请求只能向同一域名下的接口发送请求,无法直接访问其他域名下的接口。为了解决这个问题,可以使用JSONP、CORS等方式进行跨域请求。 上述代码中,使用了Axios库发送GET请求,并在请求头中设置了`Access-Control-Allow-Origin`字段。这个字段指示服务器允许任何源(域、协议和端口)的网站访问该API接口。注意:实际生产环境中,应该根据实际情况设置合适的跨域策略。 相关问题: 1. 除了设置`Access-Control-Allow-Origin`,还有哪些常见的跨域解决方案? 2. Axios支持哪些其他常用的请求方法? 3. 如何处理Axios发送请求时的错误信息?
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值