vue.js + springboot 编写前后端分离项目产生的跨域问题

本文深入探讨了前后端分离项目中跨域问题的产生原因及解决方案,详细讲解了如何在开发环境中配置代理以解决跨域问题。

在开发前后端分离的网站时,跨域是我们经常能遇到的问题。对于没有经验的开发者来讲,在开发过程中跨域也是一个很棘手的问题。
发出跨域请求时候的提示

产生跨域问题的原因

浏览器出于安全原因会阻拦不同域名之间的请求,以防止跨域攻击。跨域攻击是通过浏览器cookies的漏洞,让一个危险网站通过保存的cookies进行一些危险的操作。具体跨域攻击的技术细节和防御原理在这里就不多讲了。
一般来讲,当两个地址的协议、主机名、端口有一个不一样的时候,就会被视为跨域。

前后端分离项目的跨域问题

生产环境

在前后端分离项目的生产环境中,前端只是一些静态文件。
举个例子,我们可以把打包好的jar包跑在81端口,然后用nginx来监听80端口,并用root来指定打包好的静态前端文件。所有对后端server的访问都可以通过nginx来转发,所以不会产生跨域问题。

开发环境

在开发环境中,一般我们会把前端项目用node跑在本地(localhost)的某个端口上(默认8080),同时,spring boot会跑在本地的另一个端口上(无法与node server跑在同一个端口)。由于端口不同,此时会产生跨域问题。
在开发环境中,我们可以在vue的根目录下建立一个文件:vue.config.js (需跟package.json 在同一文件夹):

module.exports = {
    devServer: {
        proxy: {
            "/api": {
                target: "http://localhost:81",
                changeOrigin: true,
                ws:true,
                pathRewrite: {
                    "/api/": '/api/'
                }
            }
        }
    }
};

这样前端文件中所有对/api 的访问都会被自动转发至localhost:81 ,从而解决了开发环境产生的跨域问题。
这段代码中,devServer.proxy 就是为前端跨域请求设置的代理,changeOrigin: true 代表了请求需要跨域,必须要加,而pathRewrite 为路径重写表,代理转发请求的时候会按照该表重写请求。更多具体参数可以参考vue.js的官方文档:devServer.proxy

### Spring BootVue 3 前后端分离项目结构示例 在现代Web开发中,Spring Boot作为后端框架,Vue 3作为前端框架,二者结合可以实现高效、灵活的前后端分离架构。以下是基于Spring BootVue 3的前后端分离项目的典型结构及其配置方法。 #### 后端部分 (Spring Boot) 1. **创建Spring Boot项目** 使用Spring Initializr工具或者IDEA内置功能快速生成一个基础Spring Boot项目[^2]。确保引入必要的依赖项,例如`spring-boot-starter-web`用于RESTful API支持,以及`mybatis-plus-spring-boot-starter`用于数据库操作。 2. **SQL脚本设计** 定义好数据库表结构并执行初始化SQL语句来准备测试数据。这一步通常放在资源文件夹下的`schemas.sql`或`data.sql`中自动加载[^1]。 3. **实体类与Mapper层定义** 利用MyBatis Plus自动生成CRUD接口对应的代码片段,减少重复劳动量的同时提高效率[^1]。 4. **Controller层编写** 构建Rest风格API控制器暴露给前端调用。例如: ```java @RestController @RequestMapping("/api/users") public class UserController { private final UserService userService; public UserController(UserService userService){ this.userService = userService; } @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable Long id){ Optional<User> userOptional = userService.findById(id); return userOptional.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } } ``` 5. **处理** 如果前后端部署在同一台服务器的不同端口下,则需解决CORS问题。可以通过全局配置方式简化设置过程[^3]: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:8080","http://localhost:5173") //允许访问的源地址 .allowedMethods("*") //允许所有的HTTP动词 .maxAge(3600); //缓存时间秒数 } } ``` #### 前端部分 (Vue 3) 1. **安装Vue CLI工具链** 首先确认已安装Node.js环境,接着通过npm命令行工具下载最新版Vue CLI以便后续项目初始化工作顺利开展。 2. **建立新的Vue工程** 运行`vue create my-project-name`指令按照提示选项逐步定制化新项目特性集,推荐选用TypeScript增强类型安全性,并开启Router模块方便页面导航管理。 3. **组件开发** 开始着手具体业务逻辑编码阶段,在此期间可借助Element Plus这类UI库加速界面布局搭建速度。比如列表渲染场景示范代码如下所示: ```javascript <template> <el-table :data="tableData"> <el-table-column prop="date" label="日期"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> </el-table> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ setup() { const tableData = ref([ {"date": "2023-09-01", "name": "张三"}, {"date": "2023-09-02", "name": "李四"} ]); return { tableData }; }, }); </script> ``` 4. **Axios网络请求封装** 创建统一的服务函数用来发起异步通信动作至远程服务端获取动态更新的数据内容。 #### 数据交互流程说明 当用户触发某个事件时(如点击按钮),前端会向指定URL发送Ajax请求;而后端接收到该请求解析参数后查询相应记录返回JSON格式的结果集合供客户端进一步加工呈现出来形成最终视觉效果反馈给使用者查看体验整个闭环运作机制。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值