前端开发服务器中的 Proxy 代理跨域实现原理解读

news2025/7/12 17:00:58

在这里插入图片描述

各位朋友你们好,我是桃小瑞,微信公众 @ 桃小瑞。在这给大家拜个晚年,祝各位朋友新年快乐。

前言

在前端的开发过程中,尤其是在浏览器环境下,跨域是个绕不开的话题,相信每个前端都会涉及到这个问题,记住的就直接手敲解决跨域问题,记不住的就只能问度娘了。😂😂

即将登场的是我们的二号人物,跨域。👇👇👇

跨域

一、什么是跨域?

跨域是指在浏览器环境中存在的一种资源同源保护策略。当页面使用ajax/fetch进行网络请求或者页面进行资源请求时,网络协议域名端口不一致时就会触发浏览器的同源策略保护机制。

浏览器就会在控制台输出像下面图片中的内容。

image.png

二、解决跨域有哪些途径呢?

见招拆招,有限制就有对策。目前有很多可以解决跨域的问题,各位看官请移步往下看👇👇👇

常见的解决跨域方式

1、 JSONP

利用script标签没有跨域的限制,从而实现跨域。

注:JSONP仅支持get请求,并且需要后端的支持。

2、 CROS( Cross-Origin Resource Sharing )

利用 CROS实现跨域,后端在请求的响应请求头上添加Access-Control-Allow-Origin属性,并设置指定的站点值,或者设置为*

注:需要前后端同时支持。

3、 nignx

nignx 反向代理

4、websocket

利用websocket,实现浏览器与服务器的全双工通信,同时允许跨域通讯。

5、iframe

iframe 搭配 document.domainlocation.hashwindow.name三种方式实现跨域。

6、node作为中间件代理

启用一个本地的node服务器充当中间件,进行跨域处理。

工作中常常用方式

在工作中常见的跨域使用方式有nignx 反向代理CROSnode 中间代理

为什么说node 中间代理也是常用的方式呢?都没看见使用过呀。来来来,此时此刻就需要涉及到我们今天的主人公了。

三、跨域疑问

跨域的时候,请求是否是发出去了的呢?数据我们是否又收到了呢?

答案:

跨域的时候,请求是已经发出去了,而且后端已经将数据返给我们了的,只是被浏览器劫持了,我们拿不到而已。

相信你看完下面的模拟对话就能懂了。

  • 前端:发送请求给后端。
  • 后端:收到请求,数据返给你了。
  • 浏览器:你后端这所在地(指:协议、域名、端口)和我所在地不对呀,肯定不可信,拦截掉,为了不让前端云里雾里的,我给它报个异常吧。
  • 我们的数据就这样被浏览器所拦截,不给我们了。

node 中间代理

node 中间代理 它还有另外一个名字,叫 Proxy 代理跨域。主角闪亮登场。👏👏

简单使用

我们一起来回顾一下它的写法:

server: {
    proxy: {
      '/api': {
        target: 'http://locahost:3000', // 目标地址
        changeOrigin: true, // 是否换源, true 换源
        rewrite: (path) => path.replace(/^\/api/, ''), // 替换
      }
    }
  }

环境说明

我这里使用的环境为:

  • vue
  • vite

其他的脚手架等原理都差不多。环境对我们来说都不是事,因为我们需要扒的是它的原理。

现在我们步入正题。

复现

我们现在来启动我们的项目。

pnpm run dev

image.png

我们发现,vite 给我们启动了一个本地的 node 服务器,地址为:http://127.0.0.1:5173/。

image.png

然后现在我们来发个请求试试。

我们先把 vite.config.js中的代理关掉。

image.png

我们在onMounted中添加请求。

fetch('http://127.0.0.1:5888/api', {
    method: 'get'
})

此刻我们打开我们的控制台,惊喜来了。

image.png

开启代理

我们现在放开vite.config.js中的代理注释。

image.png

再来看看

image.png

image.png

原理解析

在 vite 启动的时候,创建了一个开发服务器,然后根据我们进行的开发服务器配置进行 node 中间件代理。vite 根据配置和我们请求的 api 地址去请求对应的 api地址,我们怎么把参数给它的,它就怎么给目标地址;然后目标地址怎么给 vite 的,vite 就原模原样的给我们。可能我说的有点绕,我们一起看一下下面的图。

下图为 node 开发服务 代理请求流程图。

image.png

为什么 node 就可以解决跨域呢?

因为 node 不是运行在浏览器中的东西,所以没有跨域这种问题。

温馨提醒

跨域,也就是同源策略只存在于浏览器环境。如:chrome、ie、浏览器、webview、使用了浏览器内核的环境。在app、小程序等平台中是没有这个的。

总结

以上就是前端 Proxy 代理跨域实现原理解读的全部内容。希望本篇文章对你有所帮助。

如有不足或你有其他的见解欢迎留在评论区。

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

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

相关文章

“write javaBean error, fastjson version 1.2.83, class org.apache.shiro.web.servlet.ShiroHttpServletR

1. 相关技术 springboot 2.6.3mybatis-spring-boot-starter 2.2.2mybatis 3.5.10fastjson 1.2.83hutool-all 5.7.22shiro-spring 1.8.0 2. 报错信息 "write javaBean error, fastjson version 1.2.83, class org.apache.shiro.web.servlet.ShiroHttpServletRequest, meth…

<router-view> can no longer be used directly inside <transition> or <keep-alive>.

百度翻译: <router view>不能直接在<transition>或<keep alive>中使用。 改用插槽道具: 运行环境: "vue": "^3.2.8", "vue-router": &quo…

idea的vue文件中使用ElementUi组件

作为计算机专业的学生,在做实训项目时很惆怅前端页面的搭建,这个时候就突出到了组件的好处; 这篇就是给大家展示使用ElementUi组件!!! 内容上分为vue3和之前的版本,自行选择!&#x…

33.JavaScript映射与集合(Map、Set)数据类型基础知识介绍与使用

文章目录映射与集合(Map、Set)映射(Map)Map常用的方法不要使用map[key]访问属性对象作为Map的键Map的遍历与迭代默认的迭代方式forEach()从数组、对象创建Map从数组、Map创建对象集合(Set)集合迭代总结映射…

Vuex 之一:3种拿到 state 中数据的方式与实例剖析

Ⅰ、Vuex 简介: 1、Vuex 是什么? 答:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式; 而所谓状态就是指:组件中所维护的数据); (简而言之:就是状态管理,解决复杂组件数据通信&#xff0c…

React中实现keepalive组件缓存效果

背景:由于react官方并没有提供缓存组件相关的api(类似vue中的keepalive),在某些场景,会使得页面交互性变的很差,比如在有搜索条件的表格页面,点击某一条数据跳转到详情页面,再返回表…

处理vue中的长按事件、点击事件、默认事件冲突

写在前面 示例是h5项目。技术栈:vue vant nuxt。 知识点简介: touchstart: // 手指放到屏幕上时触发 touchend: // 手指离开屏幕时触发 touchmove: // 手指在屏幕上滑动式触发 touchcancel: // 系统取消touch事件的时候触发 页面及需求: …

一文教会你何为重绘、回流?

文章目录css图层图层创建的条件重绘(Repaint)回流触发重绘的属性触发回流的属性常见的触发回流的操作优化方案requestAnimationFrame----请求动画帧写在最后学习目标: 了解前端Dom代码、css样式、js逻辑代码到浏览器展现过程了解什么是图层了解重绘与回流了解前端层…

【已失效】免翻在Chrome上使用新必应(New Bing)聊天机器人

已失效,暂时没时间去摸索,大家可以在评论区讨论,其实大家评论的我也尝试过了,并没有找到一个很完美的方式,有时间折腾再更新吧!! 这里不讲如何加入New Bing内测 文章目录【更新】免翻使用New B…

如何理解虚拟DOM

一、js 操作DOM 假如现在你需要写一个像下面一样的表格的应用程序,这个表格可以根据不同的字段进行升序或者降序的展示。 这个应用程序看起来很简单,你可以想出好几种不同的方式来写。最容易想到的可能是,在你的 JavaScript 代码里面存储这样…

【CSS重点知识】属性计算的过程

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 标题什么是计算机属性确定声明值层叠冲突继承使用默认值总结什么是计算机属性 CSS属性值的计算…

Vue实例生命周期

Vue实例的生命周期就是Vue实例从创建到销毁的全过程。在这个过程中,经历了创建、初始化数据、编译模板、挂载Dom(beforeCreate(){}、created(){}、beforeMount(){}、mounted(){})、渲染→更新→渲染(beforeUpdate(){}、updated(){})、卸载(beforeDestroy(){}、destr…

SVG+CSS动画实现动效(流光、呼吸等效果)

流光效果 绘制流光线条 创建SVG,根据UI给的背景图,定位到图上每条管道(即流光线条的路径)的起始点以及拐点,绘制折线。绘制折线的时候按照下图方框通过class分组,这几组的光线流动是同时出发的。 svg相关知…

【大学生期末大作业】HTML+CSS+JavaScript — 模仿博客网站设计(Web)

你为什么不亲自下船, 就一次也好啊, 亲眼去看看这个世界。 目录 你为什么不亲自下船, 就一次也好啊, 亲眼去看看这个世界。 关于HTML5: 关于CSS: 关于JavaScript: 一、🌎前言…

牛客前端刷题(四)——微信小程序篇

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦! 赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏…

Vue 使用 Vue-socket.io 实现即时聊天应用(Vue3连接原理分析)

目录 前言: 一、新建 Vue3 项目 二、下载相关依赖 2.1 后台服务 2.2 前端连接 2.3 启动项目 2.4 触发与接收事件 2.5 原因分析 三、vue3 使用socket的原理 3.1 socket对象实例 3.2 socket 触发事件 3.3 socket对象监听原生事件 3.4 vue-socket.io 源码解析 …

宝塔面板安装部署Vue项目,Vue项目从打包到上线

前期准备 1.宝塔面板已经成功安装到服务器 2.vue项目已经成功开发完成 开始 在宝塔面板中选择PHP项目添加站点,站点PHP版本设置为纯静态,输入域名或者IP 这是后你会获得一个网站文件目录 点击根目录进入目录后,若你的Vue项目么有打包好需…

可视化大屏的几种屏幕适配方案,总有一种是你需要的

假设我们正在开发一个可视化拖拽的搭建平台,可以拖拽生成工作台或可视化大屏,或者直接就是开发一个大屏,首先必须要考虑的一个问题就是页面如何适应屏幕,因为我们在搭建或开发时一般都会基于一个固定的宽高,但是实际的…

海康摄像头web无插件3.2,vue开发,Nginx代理IIS服务器

在vue中实现海康摄像头播放,采用海康web无插件3.2开发包,采用Nginx代理IIS服务器实现; 1 摄像头要求,支持websocket 2 Nginx反向代理的结构 3 vue前端显示视频流代码 参考地址: https://blog.csdn.net/Vslong/artic…

【Vue全家桶】新一代的状态管理--Pinia

🍳作者:贤蛋大眼萌,一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 ,一名很普通但不想普通的程序媛}贤蛋大眼萌,一名很普通但不想普通的程序媛🤳 🙊语录:多一些不为什么的…