Spring Boot 与 Next.js 前后端分离开发中的跨域问题解决方案

酷浩吖_4851

酷浩吖_4851

2026-10-18

731人浏览

原创

Spring Boot 与 Next.js 前后端分离开发中的跨域问题解决方案

本文详解如何在 Spring Boot(集成 Spring Security)与 Next.js 构建的全栈应用中,正确处理 CORS 错误——尤其针对预检请求失败、响应头缺失 Access-Control-Allow-Origin 的典型问题,并推荐更优的开发期代理方案。

本文详解如何在 spring boot(集成 spring security)与 next.js 构建的全栈应用中,正确处理 cors 错误——尤其针对预检请求失败、响应头缺失 `access-control-allow-origin` 的典型问题,并推荐更优的开发期代理方案。

在本地开发中,当 Next.js 前端(http://localhost:3000)调用 Spring Boot 后端(http://localhost:8081)API 时,浏览器会因同源策略触发 CORS 预检(OPTIONS 请求)。若后端未正确响应预检请求(如缺少 Access-Control-Allow-Origin、Access-Control-Allow-Methods 等关键头),就会报出如下经典错误:

Access to XMLHttpRequest at 'http://localhost:8081/api/v1/auth/login' 
from origin 'http://localhost:3000/' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

你当前的配置存在两个关键问题:

  1. Spring Security 的 CorsConfigurationSource 未生效:虽然定义了 @Bean CorsConfigurationSource,但 Spring Security 默认不会自动使用它,除非显式启用 CORS 支持;
  2. WebMvcConfigurer 与 Spring Security 的 CORS 配置冲突:WebMvcConfigurer#addCorsMappings 仅作用于 Spring MVC 层,而 Spring Security 的过滤器链(如 SecurityFilterChain)会拦截并优先处理请求;若未在 Security 配置中启用 CORS,MVC 层的 CORS 映射将被跳过。

✅ 正确做法是:在 HttpSecurity 中显式启用 CORS,并关联你的 CorsConfigurationSource Bean。修改 SecurityConfig 如下:

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .cors(cors -> cors.configurationSource(corsConfigurationSource())) // ? 关键:启用并指定配置源
        .csrf(csrf -> csrf.disable())
        .authorizeHttpRequests(authorize -> authorize
            .requestMatchers("/api/v1/auth/register", "/api/v1/auth/login")
            .permitAll()
            .anyRequest()
            .authenticated()
        )
        .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        .authenticationProvider(authenticationProvider)
        .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
    return http.build();
}

同时,移除 KeeperApplication 中重复且低效的 WebMvcConfigurer Bean(尤其避免使用 allowedOrigins("*") 在生产环境):

// ❌ 删除此 Bean —— 它在 Security 拦截后不生效,且 `*` 不支持凭据(如 cookies)
/*
@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*");
        }
    };
}
*/

⚠️ 注意事项:

  • allowedOrigins("*") 无法与 withCredentials: true(如携带 Cookie 或 Authorization 头)共存,应明确指定来源(如 "http://localhost:3000");
  • 生产环境务必限制 allowedOrigins,禁止通配符;
  • 若前端需发送认证凭据(如 JWT 存于 Cookie),需额外配置:
    configuration.setAllowCredentials(true); // 在 CorsConfiguration 中设置

然而,更推荐的开发实践是彻底规避 CORS —— 使用 Next.js 内置的 Rewrites 功能进行服务端代理。这不仅绕过浏览器 CORS 限制,还能统一 API 基础路径、提升调试体验,且无需后端任何 CORS 配置。

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载

在项目根目录 next.config.js 中添加重写规则:

/** @type {import('next').NextConfig} */
module.exports = {
  async rewrites() {
    return [
      {
        source: '/api/:path*',     // 匹配所有 /api/ 开头的请求
        destination: 'http://localhost:8081/:path*' // 代理到 Spring Boot
      }
    ];
  }
};

配置后,前端可直接发起相对路径请求:

// Next.js 页面中
const res = await fetch('/api/v1/auth/login', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ email, password })
});

该请求实际由 Next.js Dev Server 转发至 http://localhost:8081/api/v1/auth/login,完全同源(都是 http://localhost:3000 发起),彻底消除 CORS 干扰。

✅ 总结:

  • 临时调试可修复 Spring Security 的 CORS 配置(启用 cors() 并绑定 configurationSource);
  • 长期开发与最佳实践,请优先采用 Next.js Rewrites 代理,安全、简洁、符合现代全栈协作范式;
  • 生产部署时,应通过 Nginx 或云网关统一路由和跨域策略,而非依赖应用层 CORS。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js spring boot

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6450

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5866

10

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

631

5

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

2023.10.12

1455

7

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

2025.08.19

4866

10

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

2025.12.22

436

5

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

2025.12.24

640

18

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

2026.02.11

385

24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习