学艺不精,总是掉坑!前后端分离历险记

article/2025/6/24 15:32:52

Spring Boot + Vue 这一对技术栈目前看来可以说是非常的火热,关于 Spring Boot 松哥已经写过多篇教程,如:

  • 40 篇原创干货,带你进入 Spring Boot 殿堂!

前后端分离的文章也写过好几篇了,例如:

  • 一个Java程序猿眼中的前后端分离以及Vue.js入门

  • 前后端分离开发思路探讨

  • 前后端分离时代,Java 程序员的变与不变!

相信大家也从中学到了不少干货。

老实说,前后端分离其实并不难,前后端分离之后,Java 工程师只需要专心写接口就可以了,在我看来工作可比以前轻松多了。

如果让一个专业的前端工程师来写前端页面,其实也不难,Vue 算是三大前端框架中最容易上手的了。

那怎么样就有难度了呢?

让同一个人既写前端又写后端!

我知道很多小伙伴在这里总是想不通,很多人 clone 了松哥在 GitHub 上的开源项目下来之后,问的最多的问题就是前后端是怎么通信的?跨域是怎么解决的?刚好松哥最近在这里踩了个坑,就来和大家聊一聊这个问题。

不是跨域的跨域

如果你直接在项目中引入 Vue,像用 jQuery 那样用 Vue,那没什么问题,你应该也不会有跨域的疑问。但是如果你做的是单页面应用(SPA),那么必然会有这样的疑问,跨域问题怎么搞!

因为在单页面应用中,前端项目可以单独通过 node 启动,它单独占用一个端口,后端项目启动后也是另外一个端口,此时从前端发送请求到后端,由于两者处于不同的端口之上,因此必然存在一个跨域问题。

但是大家想想,这个跨域有可能只是在开发环境下存在,生产环境下有可能不存在。因为当项目开发完成之后,我们对前端项目进行打包,打包后部署在 Nginx 上或者直接拷贝到后端项目中运行都可以(一般使用前者):

  • 如果是前者,后端接口也通过 Nginx 进行映射,这个时候就不会存在跨域问题了

  • 如果是后者,那就更简单了,部署的时候前后端代码放在一起,更不会有跨域问题了

因此,解决这个所谓的 “跨域” 问题,我们不能按照传统的思路来(通过 JSONP 或者 CORS),因为在项目真正上线后,所谓的跨域问题可能就会消失。

那么这个问题怎么解决呢?我们可以在前端 nodejs 中配置请求转发。

配置请求转发其实不难,不过 vue-cli2 和 vue-cli3 的写法稍有不同,这也是我前一段时间踩坑的地方。

vue-cli2 方案

如果我们使用的 vue-cli2 来创建的 SPA 应用,创建成功之后,在项目的 config 目录下有一个 index.js 文件,在这个文件中,我们可以进行请求转发配置,如下图:

640?wx_fmt=jpeg

配置内容如下:

module.exports = {dev: {// PathsassetsSubDirectory: 'static',assetsPublicPath: '/',proxyTable: {'/': {target: 'http://localhost:8082',changeOrigin: true,pathRewrite: {'^/': ''}},'/ws/*': {target: 'ws://127.0.0.1:8082',ws: true}},...}

proxyTable 就是我们配置的转发路由表。这个里边我们一共配置了两个规则:

  • 第一个是拦截所有 HTTP 请求,将之转发到后端服务器上(前端默认端口是 8080),后端的端口是 8082。至于拦截规则 / ,大家可以自定义,根据实际情况来写,例如所有的 HTTP 请求都有一个统一的前缀 api,那么这里就可以写 /api

  • 第二个是拦截所有的 websocket 请求进行转发,我这里给所有的 websocket 请求取了一个统一的前缀 /ws

如果你有更多的拦截规则,继续在这里配置就可以了,这些配置只会在开发环境下生效,当项目编译打包时,这些配置是不会打包进去的,也就是说,项目发布的时候,这些配置是失效的,这个时候我们通过 Nginx 或者将前端代码拷贝到后端,就可以解决生产环境下的跨域问题了(相当于开发时候的跨域在生产环境下不存在)。

相对来说,vue-cli2 在这里的配置还比较容易。

vue-cli3 方案

vue-cli3 去年出来后,当时就尝了一把鲜,但是可能 vue-cli2 用久了,一时半会还不愿意接受 vue-cli3 ,于是尝鲜完了之后就放下了,没怎么用了。直到前两天,新项目尝试了一下 vue-cli3,结果在请求转发这块就掉坑里了。

一开始没多想,还是 vue-cli2 里边的老办法,只不过是在 vue-cli3 创建的项目的 vue.config.js 文件中进行配置,文件位置如下图:

640?wx_fmt=jpeg

注意,使用 vue-cli3 创建的 SPA 应用,没有 config 目录了,因此请求转发的配置我们要在 vue.config.js 这个配置文件中来配置。

一开始我直接把 vue-cli2 中的请求转发配置拷贝过来,这样发送 HTTP 请求倒是没问题,但是 websocket 请求一直有问题,后来经过仔细分析,发现这两者在请求转发配置上有一点点差异,我们来看看 vue-cli3 中的请求转发配置(这也是我这里 vue.config.js 文件的完整内容);

let proxyObj = {};
proxyObj['/ws'] = {ws: true,target: "ws://localhost:8081"
};
proxyObj['/'] = {ws: false,target: "http://localhost:8081",changeOrigin: true,pathRewrite: {'^/': ''}
};
module.exports = {devServer: {host: 'localhost',port: 8080,proxy: proxyObj}
}

首先我们创建一个 proxyObj 用来放各种代理对象,至于代理的内容这里的则和 vue-cli2 中的没有太多差异。要注意的是,HTTP 请求代理中,多了一个属性 ws: false,用过 vue-cli3 同学可能发现了,如果不加这个属性,浏览器控制台会一直报连不上 socket 的错,加上就没事了。

最后在 devServer 中指定项目的 host 和 port ,然后再配置一下 proxy 对象就可以啦。

这就是我们在 vue-cli3 中请求的配置。

不过这里的配置老实说没有什么难度,做过一次就会啦,要是没做过,头一次可能得折腾半天。

结语

很多小伙伴一直对于前后端分离开发,前后端请求是如何对接的一直有疑问,希望这篇文章能够给你一些启发。如果看懂了,可以点个在看或者转发支持下哦。

640?wx_fmt=gif

640?wx_fmt=gif

1、一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!

2、完结撒花!129 集 21 个小时,松哥自制的 Spring Boot2 系列视频教程杀青啦!

3、40 篇原创干货,带你进入 Spring Boot 殿堂!

4、Spring Boot 中的同一个 Bug,竟然把我坑了两次!

5、Spring Boot 支持 Https 有那么难吗?

6、一个野生程序员的自我修养

7、干货 | 鸟瞰 MySQL,唬住面试官!

8、Spring Boot 修改静态资源一定要重启项目才会生效吗?未必!

9、Spring Boot 跨域,JSONP 太 low,试试 CORS 怎么样?

640?wx_fmt=jpeg

喜欢就点个"在看"呗^_^


http://chatgpt.dhexx.cn/article/ZMShpoDl.shtml

相关文章

测试4年裸辞失业,面试17k的测试岗被按在地上摩擦,结局让我崩溃大哭...

作为IT行业的大热岗位——软件测试,只要你付出了,就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的,但放眼望去,哪个工作不是这样的呢?会有哪家公司愿意养一些闲人呢?…

一名【合格】前端工程师的自检清单,劝退指南 >_<

到现在为止,前端工程师已经成为研发体系中的重要岗位之一。可是,与此相对的是,我发现极少或者几乎没有大学的计算机专业愿意开设前端课程,更没有系统性的教学方案出现。大部分前端工程师的知识,其实都是来自于实践和工…

测试4年裸辞失业,面试17k的测试岗被按在地上摩擦,结局让我崩溃大哭....

作为IT行业的大热岗位——软件测试,只要你付出了,就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的,但放眼望去,哪个工作不是这样的呢?会有哪家公司愿意养一些闲人呢?…

Linux文件导入gitee仓库中

文章目录 零.前言1.在gitee中建立仓库2.向Linux系统中导入仓库3..gitignore4.总结 零.前言 本文将介绍如何将Linux中的文件存入gitee的仓库中,由于github时常登不上去,所以国内推荐gitee。 1.在gitee中建立仓库 首先我们先注册一账号,这里…

年少成名的我并没有放弃自己,谁敢说她\他文章比我写的好?!,不服来战!

大家镇定一下情绪,文章要开始了。 不择手段是人杰,不改初衷是英雄! 年前读了老罗的这本书—— 《一个理想主义者的奋斗,The Adventures of an Idealist》回想起了我与新东方的故事 我与新东方的故事,大砥开始于高二…

小黑抱紧沛奇老师课程的大腿,继续学习git的日常积累:沛奇老师git笔记(git命令与分支)

课程链接 https://www.bilibili.com/video/BV1Ud4y1k715?p4&vd_source0b1383084f626b5cf37be3e82e883106 git入门 进入要管理的目录git init 初始化,即:让git帮助我们管理当前文件夹git status 检测当前文件目录下文件的状态三种状态变化 红色:新增的文件/修改了老文件…

后端开发——Flask框架从入门到入坟(终章)

前言 前面已经将Flask框架的内容基本梳理完了,在这篇文章中荔枝会将Flask的部署上云的步骤跟大家分享一下,其实也是基于宝塔页面来进行配置的啦哈哈哈。荔枝也会将环境配置命令和数据库迁移步骤分享出来,下面就由荔枝把具体的操作梳理出来吧哈…

数字电路逻辑设计_第三版_微课版_第五章思考题与练习题(附答案)

1. 触发器具有哪些基本特征? 答: 触发器的基本特征: (1)有两个稳态,可分别表示二进制数码0和1无外触发时可维持稳态; (2)外触发下,两个稳态可相互转换(称翻转…

数电基础复习(一)

电信号: 模拟电信号:电压或电流的幅值随时间连续变化数字电信号:电压或电流在幅值和时间上都是离散的(可以是多值逻辑,一般采用二值逻辑) 主要参数: 幅值:高电平的电压值上升时间…

数电设计-八路抢答器

1 设计要求 设计一个能支持八路抢答的智力竞赛抢答器;主持人按下开始抢答的按键后,有短暂的报警声提示抢答人员抢答开始且指示灯亮表示抢答进行中;在开始抢答后数码管显示30秒倒计时;有抢答人员按下抢答键后,在数码管…

模电/数电考核试题

目录: 西安交通大学17年3月课程考试《模拟电子技术》考核试题 西安交通大学17年3月课程考试《数字电子技术》考核试题 附录 -------------------------------------------------------------------------------------------- 西安交通大学17年3月课程考试《模拟…

[答案解析]华工数电实验:简易交通灯控制电路的设计

题目: 答案: 工程文件下载:https://github.com/BlademasterQAQ/A-simple-traffic-signal-lamp-in-digital-electronic-technology 用3个JK触发器实现的3位二进制计数器电路: 仿真结果:(此为上升沿触发时的仿…

【数电基础复习】

数字电子技术——概念向 数制和码制数字量与模拟量位权十-二进制运算反码、补码奇偶校验 逻辑函数逻辑代数运算最小项和最大项逻辑函数化简方法 门电路CMOS门电路CMOS反相器CMOS电压传输特性和电流传输特性CMOS反相器静态输入特性和输出特性CMOS反相器的动态特性CMOS与非门、或…

【数电】数字电子技术学习练习

一、 选择题:(共20分,每小题2分) 1、逻辑函数的所有最小项之和等于多少? A. 0 B. 1 C. 0或1 D. 任意值 2、与非门的多余输入端应如何处理?…

Java可变类型与不可变类型

一、可变类型(mutable type)与不可变类型(immutable type) 已知,基本数据类型都是不可变类型;引用(对象)数据类型既有可变类型,也有不可变类型 首先区分:改变…

Python中的可变对象

文章目录 可变对象与不可变对象关于对象图解可变对象 可变对象与不可变对象 关于什么是对象不是这篇的重点,可查看这篇 Python中面向对象的简单应用 可变对象就是说对象的值是可以改变的,序列中可变对象有list 不可变对象有str、tuple 那么问题又来了…

可变剪切|rmats

可变剪切 可变剪切(或选择性剪切)是一个过程,即主要基因或者mRNA前体转录所产生的RNA的外显子以多种方式通过RNA剪切进行重连。由此产生的不同的mRNA可能被翻译成不同的蛋白质构体,因此,一个基因可能编码多种蛋白质。 rmats 下面是小编使用…

python中的可变和不可变类型,每种类型的常用

方法及原理实现 可变数据类型 可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型 不可变数据类型 不可变数据类型: 当该数据类型的对应变量的值发生了改变,…