vue中的proxy代理的使用(解决跨域问题)

news2025/2/26 3:04:45

声明

 1. 首先我们应该知道,前端axios在本地发送的请求如果你不把路径写全,它都是会默认加上自己项目所在的端口,就比如说:

axios.get('/login')

axios.get('/hello')

当我点击发送按钮之后,以上两行代码实际为:

http://localhost:8080/login

http://localhost:8080/hello

其中 localhost:8080 就是自己项目所在的地址了。实际前端就会根据以上的地址来访问后端程序了。

2. 跨域,什么是跨域呢?

首先,明白什么是同源策略?同源就是指 协议、域名、端口 都要相同,其中任何一个不同都会出现跨域。例如:

http://www.baidu.com:8000

// http 是协议

// www.baidu.com 是域名

// 8000 是端口

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

这里说明一下,无法跨域是浏览器对于用户安全的考虑。是浏览器的锅。

同源策略限制了一下行为: Cookie、LocalStorage 和 IndexDB 无法读取 DOM 和 JS 对象无法获取 Ajax请求发送不出去。

前后端分离的模式下,前后端的域名是不一致的,所以就会出现跨域问题。

问题

当我们开发完前端一个功能之后,需要运行调试 ,通常前后端分离情况下,两套程序都运行起来之后,肯定会出现 协议、域名、端口不一致的形况吧。

那么前端调用后端接口时就会产生跨域问题。怎么办呢?就需要代理(proxy)出场了。

跨域的解决方案

解决跨域的方案有很多,比如:jsonp、cors、Node代理、nginx反向代理。这里我们只讨论 proxy。

vue中的proxy就是利用了Node代理。

代理服务器是如何解决跨域的?

 这样就可以串通了,前端通过axios发送请求时,会默认发送给本地的特性,来发送给前端配置的代理,代理根据特定规则,将地址转换为后端的接口,并请求后端接口,这样就解决了跨域的问题了。那前端vue中怎样配置代理服务器呢?

proxy配置

假如我现在想请求后端的 一个接口 例如:http://www.aaabbbccc.com/login ,这样我们应该怎样配置代理服务器呢?

以vue cli3.0为例:

// vue.config.js
  devServer: {  //开启代理服务器
    proxy:{
      "/api": {  // /api是自行设置的请求前缀,按照这个来匹配请求,有这个字段的请求,就会走到代理来。
          target: "http://www.aaabbbccc.com", // 需要代理的域名,目标域名,会替换掉匹配字段之前的路径
           ws: false, // 是否启用websockets
          changeOrigin: true, //是否跨域
          pathRewrite: {  //重写匹配的字段,如果不需要放在请求路径上,可以重写为""
              "^/api": ""
          }
      },
   
  },
  }




  //vue cli2 .0 的放在 config文件夹中的index.js  中
    dev: {
    proxyTable:{
      "/api": {
          target: "http://www.aaabbbccc.com", // 需要代理的域名
           ws: false, // 是否启用websockets
          changeOrigin: true, //开启跨域
          pathRewrite: {  //重写请求路径上匹配到的字段,如果不需要在请求路径上,重写为""
              "^/api": "",
             
          }
      },
  },
  }

以上配置中,我配置了一个 /api,只有包含这个请求的路径才会走代理,例如:

http://localhost:8080/api/login //这个就可以走代理

http://localhost:8080/login //这个就不行

可以看到,要想所有的请求都进入代理中,就必须包含/api这个路径,那么我可以对axios进行二次封装,给所有的请求加这个前缀,代码如下:

const requests = axios.create({
  
  baseURL:'/api', // 设置通用请求的地址前缀
  
  timeout:10000  //请求超时的时间
});
export default requests  //将requests实例,对外进行暴露

发送请求可以写为:

requests.get('/login').then((response) => {})
requests.get('/getlist').then((response) => {})
requests.get('/user/hello').then((response) => {})

此时我发送的请求就是:

http://localhost:8080/api/login

http://localhost:8080/api/getlist

http://localhost:8080/api/user/hello

通过代理的 target属性 加工之后就是 :

http://www.aaabbbccc.com/api/login

http://www.aaabbbccc.com/api/getlist

http://www.aaabbbccc.com/api/user/hello

就是把 /api 之前的路径 修改成了 target里配置的 目标服务器的路径。

在通过 pathRewrite属性 将 /api 替换为空 为:

http://www.aaabbbccc.com/login

http://www.aaabbbccc.com/getlist

http://www.aaabbbccc.com/user/hello

这样就可以访问到后端的对应接口了。

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

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

相关文章

使用alist将云盘映射为WebDAV

使用alist将云盘映射为WebDAV1. 下载2. Windows系统安装与配置2.1 alist 启动与配置2.2 添加启动与关闭的脚本2.3 开机启动3. Linux系统安装与配置3.1 alist 启动与配置3.2 守护进程​4. 测试 WebDAValist是一款开软的将网盘及本地硬盘映射到网络端的软件,支持多种存…

【Web前端】怎样用记事本写一个简单的网页-html

前言 出于对网站的一些突然的兴趣,我开始了解网页是如何被设计出来的。 作者水平有限,如有问题,欢迎指出。 文章目录前言一. 对网页设计的基本了解1. 网站2. 网页编辑工具1)语言2)软件二. 第一个网页1. 实操——用记事…

watch跟computed的区别

大家好,我是大帅子,今天给大家讲一下watch跟computed的区别,下面我们直接开始吧 功能上:computed是计算属性,watch是监听一个值的变化,然后执行对应的回调。 是否调用缓存:computed中的函数所依赖的属性没有发生变化,…

【Web 安全】XSS 攻击详解

文章目录一、XSS 攻击概述二、XSS 攻击原理1. XSS的攻击载荷(1) script 标签(2) svg 标签(3) img 标签(4)body 标签(5) video 标签(6)…

VUE框架

1 概述 VUE是一款前端框架,免除了JavaScript中的DOM操作,简化书写 在JavaScript中有很多没有逻辑的繁琐的重复操作,如下 而VUE改善了这个问题,简化了DOM书写。 VUE是基于MVVM(Model-View-ViewModel)思想,实现数据的…

新一代状态管理工具 -- Pinia 上手指南

一:Pinia简介和五大优势 Pinia是vue生态里Vuex的替代者,一个全新的vue状态管理库。在Vue3成为正式版以后,尤雨溪强势推荐的项目就是Pinia。 那先来看看Pinia比Vuex好的地方,也就是Pinia的五大优势。 可以对Vue2和Vue3做到很好的支…

5个前端练手项目(html css js canvas)

前言: 首先祝大家端午节快乐。本篇文章有5个练手项目 对于刚学完前端三剑客的你们。应该是一个很好的实践 目录 🥩.跑马灯 1.1效果图: 1.2思路解析 1.3源码 🍧.彩虹爱心 2.1效果图 2.2思路解析 2.3源码 🌮.闹钟…

vue中this.$set()的用法

1、this.$set()的作用 向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。 this.$set()用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性。 简单来说:就是我们在methods中给数据添加了一…

尚品汇项目笔记

尚品汇项目笔记git代码地址前端Vue核心1、vue文件目录分析2、项目配置3、组件页面样式4、清除vue页面默认的样式5、pages文件夹6、footer组件显示与隐藏7、路由传参8、多次执行相同的push问题9、定义全局组件10、代码改变时实现页面自动刷新11、Home首页其它组件12、封装axios1…

微信小程序实现分享至朋友圈的功能

微信小程序实现分享至朋友圈的功能 微信小程序从基础库 2.11.3 开始,可将小程序页面分享到朋友圈。适用于内容型页面的分享,不适用于有较多交互的页面分享。 1 设置分享状态 小程序页面默认不可被分享到朋友圈,开发者需主动设置“分享到朋友…

HBuilder X的下载与使用(详细步骤)

一、HBuilder X的下载 这里我们前往HBuilder下载官网地址:https://www.dcloud.io/进入官网后,我们可以看到HBuilder目前有两个版本,一个是windows版,一个是mac版。下载一个自己电脑适合的版本,这里我下载步骤用的是wi…

【Ajax】如何通过axios发起Ajax请求

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录axios  什么是axios  axios发起GET请求  axios发起POST请求  直接使用axios发起get…

JS解构赋值

一、前言 解构赋值语法是一种 Javascript 表达式。通过解构赋值,可以将属性/值从对象/数组中取出,赋值给其他变量。本文将讨论解构赋值的作用与其用法。 目录 一、前言 二、用途 三、数组的解构 1.变量声明并且赋值时的解构 2.默认值 3.剩余数组赋值…

js字符串转换为对象格式的3种方法

背景: js字符串转换为对象格式,一般都会想到JSON.parse(),但数据不是标准的 JSON 格式的时候会解析出错,这时候就可以使用eval() 函数、new Function()方法来转换。 常用3种将字符串string转为json对象 方法: var str…

如何解决 npm ERR! Cannot read properties of null (reading ‘pickAlgorithm‘)报错问题

1、问题描述: 在vue项目中,当我们在终端使用指令:npm install 下载 node_modules (节点_模块) 时出现报错的情况。 node_modules是安装node后用来存放用包管理工具下载安装的包的文件夹。比如webpack、gulp、grunt这些工具。 主要是这个原因&…

基于Web的疫情防控管理系统

目 录 1 绪论........................................................................................................... 1 1.1 研究背景..................................................................................................................... 1 1…

前端如何调用后端接口进行数据交互(极简)

前端调用后端接口,获得数据并渲染 一、介绍 一个完善的系统,前后端交互是必不可少的,这个过程可以分成下面几步: 前端向后端发起请求后端接口接收前端的参数后,开始层层调用方法处理数据后端将最终数据返回给前端接…

vue2和vue3的区别(由浅入深)

前言 vue2和vu3之前的区别,一直以来是面试必考题目,如何回答,回答的层次决定了面试者的对于vue2,3的理解,以及对于vue3目前稳定版本发展的方向的了解,即考察使用程度,又考察了学习能力&#xf…

babel安装失败/报错详细解决方案报以下错误: core-js@2.6.12: core-js@<3.23.3 is no longer maintained and not recommended

babel安装失败/报错详细解决方案 **问题:**在VSCode中执行命令 npm install --global babel-cli 报以下错误: core-js2.6.12: core-js❤️.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V…

Vue路由传参,页面刷新后参数丢失原因与解决方法

vue路由传参方法 在编写vue项目时,时常会使用路由在不同页面中传递参数,常见使用方式如下: this.$router.push({path: "/test",query: {a: 1,b: 2} }) 这样我们就传递了两个参数,在 /test 页面 就可以接收这两个参数…