springboot升级引入的跨域问题

本文档介绍了一次SpringBoot从2.3.3到2.5.14版本升级后,前端访问接口遇到的跨域问题。作者分享了原有配置与更新后的 CorsFilter 配置调整,着重讲解了`allowedOriginPattern`的使用以及如何解决新版环境下允许所有源的跨域问题。

springboot版本从2.3.3.RELEASE升级到2.5.14后,前端访问后台接口提示跨域问题。

将原来的跨域配置,如下:

@Configuration
public class CorsConfig{
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.setAllowCredentials(true);
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        config.addExposedHeader("token");
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }
}

修改为如下:

@Configuration
public class CorsConfig{
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOriginPattern("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setAllowCredentials(true);
        config.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }
}

参考链接:
https://blog.youkuaiyun.com/xiaolegeaizy/article/details/114312969?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-114312969-blog-117674543.pc_relevant_downloadblacklistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-114312969-blog-117674543.pc_relevant_downloadblacklistv1&utm_relevant_index=1

<think>好的,我现在需要帮助用户将他们的Spring MVC项目迁移到Spring Boot。根据用户提供的引用内容,他们提到在对接其他系统时,经常需要将基于Spring MVC的示例项目改造成Spring Boot版本,并且现在使用的是前后端分离架构。用户需要一份升级指南,所以我要综合之前的引用信息,给出一个结构清晰的步骤。 首先,我需要回顾之前的回答。用户之前询问过如何保证AOP内部调用生效,我给出了几种解决方案,比如自注入、代码重构、AspectJ编译时织入等。但这次的问题是关于项目迁移的,所以需要转换思路。不过,之前提到的引用中有几个相关的内容,比如引用[1]、[3]、[4]、[5]都涉及Spring MVC到Spring Boot的迁移,特别是引用[4]提到了启动类的配置,引用[5]详细解释了Spring Boot的特性以及Bean的生命周期,这些可能对迁移有帮助。 接下来,我需要确定迁移的主要步骤。根据用户提供的引用,迁移的关键点包括项目结构调整、配置简化、Servlet迁移、依赖管理和启动类配置。比如,引用[4]中的启动类示例和引用[2]中提到的Spring Boot的自动配置和起步依赖,这些都是迁移的重要部分。同时,用户提到前后端分离,所以可能需要处理Web相关配置,比如静态资源、视图解析器等,这些在Spring Boot中可能不需要或者需要简化。 然后,我需要考虑用户可能的痛点。例如,原来的Spring MVC项目可能有很多XML配置,而Spring Boot推荐使用Java配置和自动配置。如何将XML中的Bean定义转换为Spring Boot的自动配置或Java配置?另外,迁移过程中可能会遇到依赖冲突,如何管理起步依赖和排除不必要的依赖?还有,如何处理原有的Servlet、Filter、Listener等组件,这些在Spring Boot中如何注册? 还要注意用户提到的前后端分离,可能原来的Spring MVC项目使用了JSP等视图技术,而迁移到Spring Boot后可能需要调整为RESTful API,或者使用Thymeleaf等模板引擎。这部分需要根据用户的具体情况调整,但用户已经提到是前后端分离,所以可能不需要视图解析器,而是专注于API层。 另外,引用[5]中详细解释了Bean的生命周期和依赖注入,这在迁移过程中可能需要调整Bean的配置方式,比如从XML转移到注解,或者利用Spring Boot的自动配置。例如,原来的Spring MVC可能通过XML定义DispatcherServlet,而在Spring Boot中,自动配置会处理这些,无需手动配置。 现在需要组织这些信息,形成结构化的指南。可能需要分步骤,比如项目初始化、配置迁移、组件调整、依赖管理、测试与部署等。每个步骤下详细说明操作方法和注意事项,并给出代码示例,如启动类配置、依赖项添加、Servlet迁移示例等。 同时,用户提供的引用[4]中有一个启动类的代码示例,可以引用到指南中,说明如何创建Spring Boot的启动类,并设置包扫描路径。引用[5]中的Bean生命周期和依赖注入方式可能需要调整,比如使用@SpringBootApplication注解自动配置组件扫描,替换原来的XML配置。 另外,需要注意可能遇到的问题,比如如何处理原有的web.xml配置,Spring Boot使用嵌入式Servlet容器,如何配置端口、上下文路径等。还有,静态资源的处理,Spring Boot默认有静态资源位置,可能需要调整目录结构。 最后,需要生成相关问题,帮助用户进一步理解迁移过程中可能遇到的其他问题,比如自动配置原理、依赖冲突解决、性能优化等。 总结一下,我需要将迁移步骤分为几个主要部分,每部分详细说明,并给出代码示例和注意事项,同时结合之前的引用内容,确保信息准确可靠。</think>### Spring MVC 迁移至 Spring Boot 升级指南 --- #### 一、迁移核心目标 1. **简化配置**:利用 Spring Boot 的自动配置特性,消除 XML 配置 2. **依赖管理**:通过 `starter` 依赖统一管理组件版本 3. **嵌入式容器**:使用 Tomcat/Jetty 替代传统 WAR 包部署模式 4. **前后端分离适配**:优化 RESTful API 设计,移除视图层冗余配置 --- #### 二、迁移步骤详解 --- ##### 1. **项目初始化与依赖调整** **关键操作**: - 创建 Spring Boot 项目骨架,使用 [Spring Initializr](https://start.spring.io/) 生成基础结构 - 替换原有 Spring MVC 依赖为 `spring-boot-starter-web`: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` **注意事项**: - 移除 `web.xml` 和 `springmvc-servlet.xml` 等 XML 配置文件[^1][^4] - 检查并排除冲突依赖(如手动引入的旧版本 Spring 库) --- ##### 2. **配置迁移与优化** **核心配置项**: - **启动类配置**(替代原 Spring MVC 的 `DispatcherServlet` 初始化): ```java @SpringBootApplication(scanBasePackages = "com.your.package") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` - **Web 配置迁移**: - 原 `@EnableWebMvc` 和 XML 配置 → 使用 `WebMvcConfigurer` 接口实现: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } } ``` - 视图解析器(如 Thymeleaf):通过 `spring-boot-starter-thymeleaf` 自动配置 --- ##### 3. **Servlet/Filter/Listener 迁移** **处理方式**: - **Servlet 注册**:使用 `@ServletComponentScan` 或 `ServletRegistrationBean`: ```java @Bean public ServletRegistrationBean<MyServlet> myServlet() { return new ServletRegistrationBean<>(new MyServlet(), "/myServlet/*"); } ``` - **Filter 注册**:通过 `FilterRegistrationBean` 或 `@Component` + `@WebFilter`: ```java @Bean public FilterRegistrationBean<MyFilter> myFilter() { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/*"); return registration; } ``` **优势**:完全替代 `web.xml` 的声明式配置[^1][^4]。 --- ##### 4. **前后端分离适配** **关键调整**: 1. **禁用视图层**:移除 JSP 相关依赖,配置 `spring.mvc.view.prefix` 为空 2. **统一响应格式**:使用 `@RestControllerAdvice` 实现全局响应包装 3. **处理**:通过 `@CrossOrigin` 或 `CorsFilter` 配置 ```java @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } ``` --- ##### 5. **数据库与事务迁移** **Spring Boot 优化方案**: - 替换原 JDBC 配置为 `spring-boot-starter-data-jpa` 或 `mybatis-spring-boot-starter` - 事务管理:直接使用 `@Transactional` 注解,无需额外配置 `PlatformTransactionManager` --- #### 三、常见问题与解决方案 | 问题类型 | 解决方案 | |-------------------------|--------------------------------------------------------------------------| | 静态资源加载失败 | 检查 `spring.resources.static-locations` 配置,或自定义 `WebMvcConfigurer` | | Bean 注入冲突 | 使用 `@Primary` 或 `@Qualifier` 明确指定 Bean[^5] | | 端口/上下文路径修改 | 在 `application.properties` 中配置 `server.port` 和 `server.servlet.context-path` | | 日志配置不生效 | 添加 `logback-spring.xml` 或配置 `logging.level` 属性 | --- #### 四、验证与部署 1. **本地验证**: - 使用 `mvn spring-boot:run` 启动应用 - 检查 `/actuator/health` 端点确认服务状态 2. **打包部署**: - 生成可执行 JAR:`mvn clean package` - 使用 `java -jar your-app.jar` 运行 --- #### 五、最佳实践 1. **逐步迁移**:优先迁移核心模块,逐步替换旧组件 2. **自动化测试**:结合 `spring-boot-starter-test` 编写集成测试 3. **监控集成**:添加 `spring-boot-starter-actuator` 实现健康检查与性能监控 --- ### 相关问题 1. Spring Boot 自动配置的实现原理是什么? 2. 如何解决 Spring Boot 多环境配置(开发/测试/生产)? 3. Spring Boot 中如何实现分布式事务(如 Seata 集成)? [^1]: Spring MVC 到 Spring Boot 的 Servlet 迁移方法 [^4]: Spring Boot 启动类配置示例 : Bean 注入冲突解决方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值