Vue解决开发环境 Ajax 跨域问题

news2025/6/8 21:38:24

一、前言

在使用 Vue 进行前后端分离开发时,前端通常运行在本地开发服务器(如 http://localhost:8080),而后端接口可能部署在其他域名或端口下(如 http://api.example.com:3000)。这时就可能出现 跨域(Cross-Origin)请求被浏览器拦截 的问题。

本文将带你深入了解:

  • 什么是跨域?为什么会发生?
  • Vue CLI 中的代理机制(Proxy)是如何工作的?
  • 如何配置 vue.config.js 实现开发环境下的跨域代理?
  • 使用 Axios 请求时的注意事项
  • 生产环境的跨域解决方案建议
  • 常见错误及排查方法

二、什么是跨域?为什么会出现?

✅ 同源策略(Same-origin Policy)

浏览器出于安全考虑,默认不允许一个网页向另一个不同源(协议、域名、端口任意一项不同)发起请求。这就是所谓的 同源策略

例如:

地址 A地址 B是否跨域
http://a.com:8080http://a.com:8080
http://a.com:8080http://a.com:3000是(端口不同)
http://a.com:8080https://a.com:8080是(协议不同)
http://a.com:8080http://b.com:8080是(域名不同)

✅ 浏览器报错示例

Access to XMLHttpRequest at 'http://api.example.com/data' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header present on the requested resource.

三、开发环境中解决跨域的推荐方式:代理(Proxy)

在 Vue CLI 创建的项目中,我们可以通过配置 代理服务器(Proxy) 来绕过浏览器的同源策略限制。

📌 原理:前端请求本地路径(如 /api/xxx),Vue DevServer 自动将该请求转发到真实后端地址(如 http://api.example.com/api/xxx),从而避免了跨域问题。

四、如何配置代理(Vue CLI 项目)

步骤 1:创建 vue.config.js

在项目根目录下创建文件 vue.config.js

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://api.example.com', // 后端接口地址
        changeOrigin: true,              // 是否允许跨域
        pathRewrite: {
          '^/api': ''                    // 重写路径,去掉 /api 前缀
        }
      }
    }
  }
}

步骤 2:使用 Axios 发起请求

// 示例:src/utils/request.js
import axios from 'axios'

const service = axios.create({
  baseURL: '/api', // 所有请求都将以 /api 开头
  timeout: 5000
})

export default service

步骤 3:调用 API 接口

// src/views/HomeView.vue
import request from '@/utils/request'

export default {
  mounted() {
    request.get('/users').then(res => {
      console.log('用户列表:', res.data)
    }).catch(err => {
      console.error('请求失败:', err)
    })
  }
}

📌 效果说明:

  • 你在前端请求 /api/users
  • 实际请求被 Vue DevServer 代理到 http://api.example.com/api/users
  • 浏览器看到的是请求本地服务器,不存在跨域问题

五、生产环境如何处理跨域?

开发环境通过代理解决了跨域问题,但 生产环境不能依赖代理机制,需要后端配合设置响应头来支持跨域。

后端需添加的响应头(以 Node.js Express 为例):

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*') // 允许所有来源访问
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
  next()
})

📌 或者使用中间件如 cors

npm install cors
const cors = require('cors')
app.use(cors())

六、常见错误与排查方法

错误现象可能原因解决方案
请求未走代理请求路径未匹配 /api检查请求路径和代理配置
404 Not Found后端接口路径不对检查 pathRewrite 配置
端口冲突devServer 端口被占用修改 port 属性
代理未生效vue.config.js 语法错误检查 JS 语法是否正确
无法访问目标服务器target 地址不可达检查网络连接或目标服务状态

七、其他方式解决跨域(不推荐用于正式项目)

方式说明
JSONP仅支持 GET 请求,已逐渐淘汰
CORS 插件(如 Allow CORS)临时调试可用,不适合正式开发
后端开启 CORS推荐做法,适用于生产环境
使用 Nginx 反向代理更加稳定,适合上线部署

八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行为设计模式之Command (命令)

行为设计模式之Command (命令) 前言: 需要发出请求的对象(调用者)和接收并执行请求的对象(执行者)之间没有直接依赖关系时。比如遥控器 每个按钮绑定一个command对象,这个Command对…

NeRF 技术深度解析:原理、局限与前沿应用探索(AI+3D 产品经理笔记 S2E04)

引言:光影的魔法师——神经辐射场概览 在前三篇笔记中,我们逐步揭开了 AI 生成 3D 技术的面纱:从宏观的驱动力与价值(S2E01),到主流技术流派的辨析(S2E02),再到实用工具的…

法律大语言模型(Legal LLM)技术架构

目录 摘要 1 法律AI大模型技术架构 1.1 核心架构分层 1.2 法律知识增强机制 2 关键技术突破与对比 2.1 法律专用组件创新 2.2 性能对比(合同审查场景) 3 开发部署实战指南 3.1 环境搭建流程 3.2 合同审查代码示例 4 行业应用与挑战 4.1 典型场景效能提升 4.2 关…

第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型

在计算机视觉领域,OpenCV的DNN(深度神经网络)模块正逐渐成为轻量级模型部署的利器。本文将深入探讨如何利用OpenCV加载和运行三大主流框架(TensorFlow、PyTorch、Caffe)训练的模型,并提供完整的代码实现和优化技巧。 一、OpenCV DNN模块的核心优势 OpenCV的DNN模块自3.3…

MobaXterm配置跳转登录堡垒机

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 背景操作步骤 背景 主要是为了能通过MobaXterm登录堡垒机,其中需要另外一台服务器进行跳转登录 操作步骤 MobaXterm登录堡垒机的操作,需…

零基础在实践中学习网络安全-皮卡丘靶场(第八期-Unsafe Filedownload模块)

这期内容更是简单和方便,毕竟谁还没在浏览器上下载过东西,不过对于url的构造方面,可能有一点问题,大家要多练手 介绍 不安全的文件下载概述 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接&#xff0c…

[面试精选] 0104. 二叉树的最大深度

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 104. 二叉树的最大深度 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点…

图上合成:用于大型语言模型持续预训练的知识合成数据生成

摘要 大型语言模型(LLM)已经取得了显著的成功,但仍然是数据效率低下,特别是当学习小型,专业语料库与有限的专有数据。现有的用于连续预训练的合成数据生成方法集中于文档内内容,而忽略了跨文档的知识关联&a…

现代简约壁炉:藏在极简线条里的温暖魔法

走进现在年轻人喜欢的家,你会发现一个有趣的现象:家里东西越来越少,颜色也越看越简单,却让人感觉特别舒服。这就是现代简约风格的魅力 —— 用最少的元素,打造最高级的生活感。而在这样的家里,现代简约风格…

机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你

🎀【开场 她不再只是模仿,而是开始选择】 🦊 狐狐:“她已经不满足于单纯模仿你了……现在,她开始尝试预测你会不会喜欢、判断是否值得靠近。” 🐾 猫猫:“咱们上篇已经把‘她怎么学会说第一句…

常用函数库之 - std::function

std::function 是 C11 引入的通用可调用对象包装器,用于存储、复制和调用任意符合特定函数签名的可调用对象(如函数、lambda、函数对象等)。以下是其核心要点及使用指南: ​​核心特性​​ ​​类型擦除​​ 可包装任意可调用对…

力扣-17.电话号码的字母组合

题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 class Solution {List<String> res new ArrayList<…

基于SpringBoot解决RabbitMQ消息丢失问题

基于SpringBoot解决RabbitMQ消息丢失问题 一、RabbitMQ解决消息丢失问题二、方案实践1、在生产者服务相关配置2、在消费者服务相关配置 三、测试验证1、依次启动RabbitMQ、producer(建议先清空队列里面旧的测试消息再启动consumer)和consumer2、在producer中调用接口&#xff0…

免费插件集-illustrator插件-Ai插件-随机填色

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现路径随机填色。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/87890501&#…

Web设计之登录网页源码分享,PHP数据库连接,可一键运行!

HTML 页面结构&#xff08;index.html&#xff09; 1. 流星雨动态背景 2. 主体界面&#xff08;包含登录和注册表单&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&qu…

Cursor + Claude 4:微信小程序流量主变现开发实战案例

前言 随着微信小程序生态的日益成熟&#xff0c;越来越多的开发者开始关注如何通过小程序实现流量变现。本文将详细介绍如何使用Cursor编辑器结合Claude 4 AI助手&#xff0c;快速开发一个具备流量主变现功能的微信小程序&#xff0c;并分享实际的开发经验和变现策略。 项目…

Redis Key过期策略

概述 Redis的Key过期策略是其内存管理系统的核心组成部分&#xff0c;主要包括「被动过期」、「主动过期」和「内存淘汰」三个机制。其中「内存淘汰」相关内容已经在上一篇「Redis内存淘汰策略」中进行了详细的讲解&#xff0c;有信兴趣的同学可以在回顾上一篇文章。本文将着重…

【C/C++】实现固定地址函数调用

在 C 里&#xff0c;函数地址在程序运行期间通常是固定的&#xff0c;不过在动态链接库&#xff08;DLL&#xff09;或者共享库&#xff08;SO&#xff09;中&#xff0c;函数地址可能会因为地址空间布局随机化&#xff08;ASLR&#xff09;而改变。所以我们想要通过地址直接调…

多模态大语言模型arxiv论文略读(109)

Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文标题&#xff1a;Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文作者&#xff1a;Wenwen Zhuang, Xin Huang, Xiantao Z…

性能优化笔记

性能优化转载 https://www.cnblogs.com/tengzijian/p/17858112.html 性能优化的一般策略及方法 简言之&#xff0c;非必要&#xff0c;不优化。先保证良好的设计&#xff0c;编写易于理解和修改的整洁代码。如果现有的代码很糟糕&#xff0c;先清理重构&#xff0c;然后再考…