在 VUE 项目中,使用 Axios 请求数据时,提示跨域,该怎么解决?


在 VUE 项目开发时,遇到个问题,正常设置使用 Axios 库请求数据时,报错提示跨域问题。

那在生产坏境下,该去怎么解决呢?

其可以通过以下几种方式去尝试解决:

1、设置允许跨域请求的响应头

1.1 在响应头中添加 Access-Control-Allow-Origin 字段,将其值设置为允许跨域请求的源地址。

例如,如果您的源地址是 http://localhost:8080,则可以设置如下响应头:

Access-Control-Allow-Origin: http://localhost:8080

1.2 下面是一个简单的示例,展示如何在服务器端使用 Node.js 设置响应头。

const express = require('express')
const app = express()

// 设置允许跨域请求的响应头
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', 'http://localhost:8080')
  next()
})

// 处理 GET 请求
app.get('/api/data', (req, res) => {
  res.json({ message: 'Hello World!' })
})

// 启动服务器
app.listen(3000, () => {
  console.log('Server started on port 3000')
})

在上面代码中,使用 Express.js 创建简单的服务器,允许跨域请求的地址是 http://localhost:8080

在每个请求中,都会在响应头中添加 Access-Control-Allow-Origin,并将值设置为http://localhost:8080,这样浏览器就不会阻止跨域请求的发送了。

1.3 VUE应用层使用 Axios 发送 GET 请求,通过以下方式获取服务器返回的数据。

axios.get('http://localhost:3000/api/data')
  .then(response => {
    console.log(response.data.message)
  })
  .catch(error => {
    console.error(error)
  })

在上面代码中,使用 Axios 发送 GET 请求到 http://localhost:3000/api/data,获取服务器返回的数据,并将返回的消息打印到控制台。

要注意在实际开发中,为了应用的安全性,尽量缩小允许跨域请求的源地址。

2、使用 proxy 代理。

2.1 在 VUE 的配置文件 config.js 中配置代理,请求转发到目标服务器。

例如,如果目标服务器地址是 http://api.example.com,则可以在 vue.config.js 中添加配置:

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://api.example.com',
        changeOrigin: true
      }
    }
  }
}

在 VUE 发送请求时,将会被代理到 http://api.example.com/api

2.2 下面简单示例如何在 VUE 项目中使用代理。

2.2.1 安装 http-proxy-middleware 库

npm install http-proxy-middleware --save-dev

2.2.2 配置代理

const proxyMiddleware = require('http-proxy-middleware')

module.exports = {
  devServer: {
    before: function(app, server) {
      app.use('/api', proxyMiddleware({
        target: 'http://api.example.com',
        changeOrigin: true
      }))
    }
  }
}

配置文件中,使用 http-proxy-middleware 创建代理,并将其应用到所有路径以 /api 开发的请求中。

在配置中,目标地址设置为 http://api.example.comchangOrigin 设置为 true,表示发送请求时将设置正确的 Origin 头部。

2.2.3 在 VUE 应用层中发送请求。

axios.get('/api/data')
  .then(response => {
    console.log(response.data)
  })
  .catch(error => {
    console.error(error)
  })

这里使用了相对路径 /api/data 发送了一个 GET 请求,实际上该请求会被代理到 http://api.example.com/api/data 上。

通过这种方式,我们可以使用 VUE 提供的代理功能,将跨域请求转发到目标服务器,从而避免跨域问题。

注意:为确保代理功能正常工作,需要将 VUE 应用层的开发服务器启动在和代理服务器相同的域名和端口下。

3、设置 withCredentials 来解决 VUE 中跨域请求问题。

3.1 让 Axios 在所有请求中携带凭证信息。

import axios from 'axios';

axios.defaults.withCredentials = true; // 设置 withCredentials 选项为 true

axios.get('https://api.example.com/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

3.2 让 Axios 在单个请求中携带凭证信息。

axios.get('https://api.example.com/data', {
  withCredentials: true
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

注意: 当使用 withCredentials 时,服务器端需要设置 Access-Control-Allow-Credentials 响应头为 true,才能让浏览器接受带有凭证信息的跨域请求。


[1] 阅读原文

大家好!我是 Just,这里是[ 设计师工作日常 ],求点赞求关注!!!

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue项目使用axios发起跨域请求存在以下几种解决方案: 1. 通过设置proxyTable代理解决跨域 在`config/index.js`可以找到`dev`下的`proxyTable`属性,可以设置代理规则,如下所示: ``` module.exports = { dev: { // ... proxyTable: { '/api': { target: 'http://localhost:8080', changeOrigin: true, pathRewrite: { '^/api': '/mock' // 将/api替换为/mock } } } } } ``` 上面的代码,代理规则的`/api`表示需要代理的请求路径,`target`表示代理目标地址,`changeOrigin`表示是否改变请求的origin字段,`pathRewrite`表示路径重写规则。 2. 在服务器端设置CORS(跨域资源共享)策略 在服务器端设置CORS策略,允许指定的域名或IP地址访问API。具体的设置方法可以参考服务器框架的文档,比如,如果是使用Express框架,可以通过以下代码启用CORS: ``` const express = require('express') const app = express() app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', 'http://localhost:8080') // 允许访问的域名或IP地址 res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') // 允许的请求方法 res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization') // 允许的请求 res.header('Access-Control-Allow-Credentials', 'true') // 是否允许发送Cookie next() }) // 其他路由和间件 ``` 3. 使用JSONP解决跨域 JSONP是一种跨域请求方式,只支持GET请求,但是需要服务器端支持。在Vue可以使用vue-jsonp插件来实现JSONP请求,具体使用方法可以参考插件文档。 以上三种方法都可以解决Vue项目使用axios发起跨域请求的问题,选择哪种方法取决于具体的应用场景和服务器端环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

设计师工作日常

请我炫个饼🫓

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值