当前位置: 首页 > news >正文

解决:前后端跨域请求

关于跨域请求出现的原因


前端地址:http://localhost:5173(Vue 默认端口)

后端地址:http://localhost:8080(常见后端默认端口)

差异点:端口号不同(5173 vs 8080)

结果:浏览器认为二者不同源,触发同源策略限制,导致跨域请求被拦截。


同源策略

定义协议(http/https)、域名(example.com)、端口(:8080)三者完全相同才视为同源。

限制行为:

  • 阻止跨域 AJAX/Fetch 请求。
  • 限制跨域读取 DOM(如 <iframe> 内容)。
  • 限制 Cookie、LocalStorage 的跨域访问。

示例(跨域问题)

前端使用vue3 框架书写,启动前端默认端口号是5173,后端默认端口号是8080,这就会导致客户端与服务器之间发送请求时因端口号不同产生跨域问题。

根本原因:浏览器发现请求的源(5173)与目标(8080)端口不一致,且后端未明确允许跨域访问。


如何解决跨域请求

未解决前:


方法一:配置后端服务器以允许跨域请求(后端)

思路:之前报错是因为不同源(端口号,域名,协议)之间的访问,在后端服务器配置 CORS(跨域资源共享) 规则,允许来自 http://localhost:5173 的请求跨域访问后端接口(运行在 8080 端口)。


在spring boot项目中添加一个配置类:CorsConfig

package com.it.heima.ssmp.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {// 允许跨域访问的映射路径,这里表示所有registry.addMapping("/**").allowedOrigins("http://localhost:5173") // 允许前端源// 允许跨域访问的请求方法.allowedMethods("GET", "POST", "PUT", "DELETE")// 允许跨域访问的请求头.allowedHeaders("*")/// 允许跨域访问的响应头.allowCredentials(true);}
}

启动springboot项目,前端vue项目测试结果


方法二:使用代理服务器(前端)

思路

  • 前端运行在 http://localhost:5173(开发服务器端口)。
  • 当代码中发起 /api/xxx 请求时,代理服务器拦截该请求。
  • 代理将请求转发到 http://localhost:8080/api/xxx(后端端口)。
  • 浏览器感知不到转发,认为请求仍来自 5173,从而避免跨域错误。

一 ,使用ajax发送异步请求时 使用api 替代原本访问后端的端口号

这里的api 表示前端默认端口号5173

// axios.get('http://localhost:8080/user/select')
//使用api替换http://localhost:8080 默认使用前端端口号5173
axios.get('/api/user/select').then(res => {console.log('请求成功')console.log(res.data)userList.value = res.data.data}
).catch(error => {console.log(error)
})
二,在 vite.config.js 文件中 配置跨域

// 配置跨域server: {proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}}

启动springboot项目,前端vue项目测试结果

相关文章:

  • 【Java学习笔记】可变参数
  • 深入解析Linux进程间通信(IPC):机制、应用与最佳实践
  • 【Java 并发编程】线程的基本使用(持续更新优化)
  • 全面掌握 Jetpack Compose 的 State 体系:核心用法与最佳实践
  • 深入理解线程死锁:从概念到 Java 实战
  • 【win11 】win11 键盘测试
  • 【Python】存储机制和容器四大件列表、元组、字典、集合
  • 【言语理解】中心理解题目之选项分析
  • Java捕获InterruptedException异常后,会自动清空中断状态
  • 卷积神经网络实战(2)
  • [ML]通过50个Python案例了解深度学习和神经网络
  • VulnHub-OSCP靶机
  • 【神经网络与深度学习】生成模型-单位高斯分布 Generating Models-unit Gaussian distribution
  • 超详细讲解C语言转义字符\a \b \r \t \? \n等等
  • 单调栈与单调队列(c艹)、可视化Qt?
  • Android第三次面试总结之网络篇补充
  • 使用 Hugging Face 镜像站快速下载大模型
  • emplace_back和push_back
  • 五、shell脚本--函数与脚本结构:搭积木,让脚本更有条理
  • Vultr之Ubuntu重设密码
  • 立夏的野火饭
  • 各地各部门贯彻落实习近平总书记重要指示精神坚决防范遏制重特大事故发生
  • 日本来信|劳动者的书信④
  • 解放军报八一锐评:青春无限好,奋斗正当时
  • 人民日报评论员:把造福人民作为根本价值取向
  • 太空飞梭项目起火,南宁方特东盟神画:明火已扑灭,无人受伤