基于spring的微服务和vue的前后端分离的项目怎么配置跨域处理

本文介绍了如何在后端使用Spring Boot配置CrosConfig以允许任意跨域请求,以及在前端Vue项目中通过vue.config.js设置代理,包括单一后端代理和多个后端服务代理的配置方法。对于前端开发人员来说,理解这些配置对于解决跨域问题和灵活管理请求路由至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 后端配置

新建一个CrosConfig.java文件(配置类),允许任意请求发送

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 跨域设置
 * 2021/10/9 10:57
 */

@Configuration
public class CrosConfig implements WebMvcConfigurer {


    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }
}

2. 前端配置代理(前后端只要一个配置就行)

vue根目录下新建一个 vue.config.js 文件

// 方法一: 当前端只需要请求一个后端(服务)时,可以使用以下这种:
module.exports = {
  devServer: {
    proxy: 'http://localhost:5000' // 配置代理的服务器地址
  }
}
  1. 优点:配置简单,请求资源时直接发给前端(8080)即可。
  2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
  3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源,即当前端存在请求的东西时,则直接返回前端的东西)
// 方法二:前端需要请求多个后端服务:用以下这种
module.exports = {
	devServer: {
      proxy: {
      '/api': {// 匹配所有以 '/api1'开头的请求路径
        target: 'http://localhost:5000',// 代理目标的基础路径
        changeOrigin: true,
        pathRewrite: {'^/api': ''} // 代理到服务器的时候,去除api路径
      },
      '/api2': {// 匹配所有以 '/api2'开头的请求路径
        target: 'http://localhost:5001',// 代理目标的基础路径
        changeOrigin: true,
        pathRewrite: {'^/api2': ''}
      }
    }
  }
}
/*
   changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
   changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:8080
   changeOrigin默认值为true
*/
  1. 优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
  2. 缺点:配置略微繁琐,请求资源时必须加前缀
<think>我们根据引用内容,构建一个基于Spring Boot后端Vue前端前后端分离系统架构图。结合引用[1]、[2]、[3]中的信息,我们可以将系统分为前端后端、数据存储基础设施几个部分。 架构图采用Mermaid格式,并按照分层的方式描述。 ### 架构图设计 ```mermaid graph TD subgraph 客户端[Client-Side] A[浏览器] --> B[Vue.js应用] B --> C[Vue Router] B --> D[Vuex状态管理] B --> E[ElementUI/组件库] B --> F[Axios HTTP库] end subgraph 服务端[Server-Side] G[Spring Boot应用] --> H[Spring Security] G --> I[Spring MVC] I --> J[Controller层] J --> K[Service业务层] K --> L[DAO数据访问层] L --> M[MySQL数据库] L --> N[Redis缓存] end subgraph 基础设施[Infrastructure] O[Nginx服务器] --> P[静态资源服务] O --> Q[反向代理/负载均衡] R[Docker容器] --> S[Spring Boot应用] R --> T[MySQL容器] R --> U[Redis容器] end B <-->|HTTP请求| Q Q --> J ``` ### 分层说明 1. **前端架构(Vue.js)** [^1][^3] - **核心框架**:Vue.js,采用单文件组件(SFC)开发模式。 - **路由管理**:Vue Router,实现前端路由控制。 - **状态管理**:Vuex,管理全局状态。 - **UI组件库**:Element UI(或其他Vue组件库),提供丰富的UI组件。 - **HTTP请求**:使用Axios库与后端进行RESTful API通信,支持请求拦截响应拦截。 - 示例代码(来自引用[3]): ```vue <script> export default { data() { return { books: [] } }, created() { const _this = this; axios.get('http://localhost:8181/book/findAll').then(function(resp) { _this.books = resp.data; }); } } </script> ``` 2. **后端架构(Spring Boot)** [^1][^2] - **核心框架**:Spring Boot,提供自动配置快速启动。 - **安全控制**:Spring Security(或Shiro),实现权限控制JWT认证[^2]。 - **Web层**:Spring MVC,提供RESTful API接口。 - **业务层**:Service层处理业务逻辑。 - **数据访问层**:DAO层(可使用MyBatis、JPA等),访问数据库。 - **数据库**:MySQL作为主数据库,Redis作为缓存(用于会话、高频数据等)[^2]。 3. **基础设施** [^1][^2] - **Web服务器**:Nginx,提供静态资源服务前端构建后的文件),同时作为反向代理将API请求转发到后端Spring Boot应用,解决问题。 - **容器化**:使用Docker容器部署Spring Boot应用、MySQLRedis,便于环境一致性扩展。 ### 前后端交互流程 1. 用户在浏览器访问前端应用(Vue.js构建的静态资源,由Nginx提供服务)。 2. 前端通过Axios发送HTTP请求到Nginx反向代理。 3. Nginx将API请求转发到后端Spring Boot应用(可能是一个或多个实例)。 4. Spring Boot应用处理请求: - 经过Spring Security进行权限验证(如JWT)。 - Controller层接收请求,调用Service层处理业务逻辑。 - Service层调用DAO层访问数据库(MySQL)或缓存(Redis)。 5. 后端处理结果以JSON格式返回给前端。 6. 前端根据返回的数据更新视图(通过Vue的响应式机制)。 ### 技术整合优势 - **前后端分离**:前端后端独立开发、部署,通过API交互,提高开发效率。 - **模块化与组件化**:前端Vue组件化,后端Spring Boot模块化,便于维护扩展。 - **企业级规范**:遵循Restful API设计规范、代码开发规范等[^1]。 - **性能优化**:Nginx提供静态资源服务负载均衡,Redis缓存提高访问速度。 ### 相关问题 1. Vue.js中如何实现路由权限控制(例如根据用户角色显示不同菜单)? 2. Spring Boot如何整合JWT实现无状态认证? 3. 在Docker容器中部署Spring Boot应用时,如何管理不同环境的配置文件? 4. 如何利用Redis缓存提升Spring Boot应用的性能? 5. Vue项目如何优化首屏加载速度(如代码分割、懒加载等)?</think>以下是基于 Spring Boot 后端 Vue 前端前后端分离系统架构图及详细说明,结合引用资料的技术整合方案: ### 系统架构图 (Mermaid 格式) ```mermaid graph TD subgraph 客户端[Client-Side] A[浏览器] --> B[Vue.js SPA] B --> C[Vue Router] B --> D[Vuex状态管理] B --> E[ElementUI组件库] B --> F[Axios HTTP库] end subgraph 服务端[Server-Side] G[Spring Boot] --> H[Spring Security] G --> I[Spring MVC] I --> J[Controller层] J --> K[Service业务层] K --> L[DAO数据访问层] L --> M[MySQL数据库] L --> N[Redis缓存] end subgraph 基础设施[Infrastructure] O[Nginx服务器] --> P[静态资源服务] O --> Q[反向代理/负载均衡] R[Docker容器] --> S[Spring Boot应用] R --> T[MySQL容器] R --> U[Redis容器] end B <-->|HTTP请求| Q Q --> J ``` ### 架构分层说明 #### 1. 前端架构层 (Vue.js) [^1][^3] ```mermaid graph LR A[Vue CLI] --> B[单文件组件] B --> C[Vue Router] B --> D[Vuex状态管理] B --> E[ElementUI] F[Axios] -->|HTTP请求| G[Spring Boot API] ``` - **核心组件**: - **Vue CLI**:项目脚手架构建工具 - **Vue Router**:前端路由管理(实现SPA) - **Vuex**:全局状态管理(替代传统Session) - **ElementUI**:UI组件库(快速构建界面) - **API交互**: ```javascript // Vue组件示例 (引用[3]) created() { const _this = this; axios.get('http://localhost:8181/book/findAll') .then(function(resp) { _this.books = resp.data; // 更新组件数据 }) } ``` #### 2. 后端架构层 (Spring Boot) [^1][^2] ```mermaid graph TB A[Controller] -->|接收请求| B[Service] B -->|业务逻辑| C[DAO] C -->|MyBatis| D[MySQL] C -->|Spring Data| E[Redis] F[Spring Security] -->|JWT认证| A ``` - **核心模块**: - **RESTful Controller**:处理HTTP请求 ```java @RestController @RequestMapping("/api/books") public class BookController { @GetMapping public List<Book> findAll() { return bookService.findAll(); } } ``` - **Service层**:业务逻辑处理 - **DAO层**:数据访问(MyBatis/JPA) - **安全控制**: - Spring Security + JWT令牌认证[^2] - 处理:`@CrossOrigin`或Nginx代理 #### 3. 数据存储层 [^2] ```mermaid graph LR A[主数据库] -->|MySQL| B[关系型数据] C[缓存数据库] -->|Redis| D[会话/高频数据] E[文件存储] -->|OSS| F[图片/大文件] ``` #### 4. 基础设施层 [^1][^2] ```mermaid graph LR A[用户请求] --> B[Nginx] B -->|静态资源| C[Vue构建文件] B -->|API代理| D[Spring Boot集群] E[Docker] --> F[微服务容器] F --> G[MySQL容器] F --> H[Redis容器] ``` - **关键配置**: - Nginx同时提供静态资源服务API反向代理 - Docker容器化部署保证环境一致性 ### 前后端交互流程 1. **浏览器请求**:访问`https://domain.com` 2. **Nginx响应**: - 返回Vue构建的静态资源(HTML/CSS/JS) - 将`/api/*`请求代理Spring Boot应用 3. **Vue应用初始化**: - 加载Vue Router配置的路由 - 通过Axios请求后端数据 4. **后端处理**: - Spring Security验证JWT令牌 - Controller调用Service处理业务 - DAO层访问数据库(MySQL+Redis) 5. **数据返回**: - 返回JSON格式数据(如`{id:1, name:"Vue实战"}`) - Vue组件通过Vuex更新状态并渲染视图 ### 技术整合优势 1. **开发效率**: - 前后端并行开发(前端Mock API,后端Swagger文档) - Vue热重载 + Spring Boot DevTools实时更新[^1] 2. **性能优化**: - 浏览器缓存静态资源(Nginx配置`expires 365d`) - Redis缓存热点数据(如查询结果) - Axios请求拦截器自动添加JWT 3. **企业级规范**: - RESTful API设计规范 - 代码分层规范(Controller/Service/DAO) - 前端组件化开发规范[^1] > 部署工具推荐:Jenkins CI/CD流水线 + Docker容器化部署[^2] --- ### 相关问题 1. Vue Router如何实现动态路由权限控制? 2. Spring Boot如何整合Redis实现分布式会话共享? 3.微服务架构下如何设计Vue前端Spring Cloud的交互模式? 4. Nginx反向代理配置中如何优化静态资源加载速度? 5. 如何利用Docker Compose管理Spring Boot + Vue的全栈开发环境?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值