[Java实战]Spring Boot 解决跨域问题(十四)

[Java实战]Spring Boot 解决跨域问题(十四)

一、CORS 问题背景
  1. 什么是跨域问题?
    当浏览器通过 JavaScript 发起跨域请求(不同协议、域名、端口)时,会触发同源策略限制,导致请求被拦截。
    示例场景:前端运行在 http://localhost:3000,后端 API 部署在 http://localhost:8080

  2. CORS 机制的作用

    • CORS(Cross-Origin Resource Sharing)是一种基于 HTTP 头的安全机制。
    • 允许服务端声明哪些外部域可以访问资源,解决合法跨域请求的限制。
二、Spring Boot 的 4 种解决方案
1. 使用 @CrossOrigin 注解(Controller 级别)

适用场景:仅需为单个接口或控制器开启跨域支持。
实现方式

@RestController
@RequestMapping("/api")
public class UserController {@CrossOrigin(origins = "http://localhost:3000")@GetMapping("/users")public List<User> getUsers() {return userService.findAll();}
}

配置参数

  • origins:允许的源(支持通配符 *,但不推荐生产环境使用)
  • methods:允许的 HTTP 方法(如 GET, POST
  • allowedHeaders:允许的请求头(如 Content-Type, Authorization
  • maxAge:预检请求缓存时间(单位:秒)
2. 全局 CORS 配置(推荐)

适用场景:为整个应用统一配置跨域规则。
实现方式

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://localhost:3000").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").allowCredentials(true).maxAge(3600);}
}

关键配置说明

  • addMapping("/**"):对所有接口生效
  • allowCredentials(true):允许携带 Cookie(需与 allowedOrigins 明确指定域名配合)
3. 结合 Spring Security 的 CORS 配置

适用场景:应用启用了 Spring Security 鉴权,需确保 CORS 配置不被安全过滤器拦截。
实现方式

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.cors(cors -> cors.configurationSource(corsConfigurationSource())).csrf().disable().authorizeRequests(auth -> auth.anyRequest().authenticated());return http.build();}@BeanCorsConfigurationSource corsConfigurationSource() {CorsConfiguration config = new CorsConfiguration();config.setAllowedOrigins(Arrays.asList("http://localhost:3000"));config.setAllowedMethods(Arrays.asList("GET", "POST"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return source;}
}

注意事项

  • 必须通过 cors.configurationSource() 显式配置,而非仅依赖 WebMvcConfigurer
  • 确保 Spring Security 的过滤器链顺序正确(CORS 处理需在认证之前)。
4. 网关层统一处理(Nginx/Spring Cloud Gateway)

适用场景:微服务架构中,在网关层统一管理跨域策略。
示例(Nginx 配置)

server {listen 80;server_name api.example.com;location / {# CORS 配置add_header 'Access-Control-Allow-Origin' 'http://localhost:3000';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type,Authorization';add_header 'Access-Control-Allow-Credentials' 'true';if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}proxy_pass http://backend-service;}
}
三、最佳实践与调试技巧
  1. 避免使用通配符 *

    • 生产环境中明确指定 allowedOrigins,如 https://your-frontend-domain.com
    • 通配符会导致 allowCredentials(true) 失效,且存在安全风险。
  2. 处理预检请求(OPTIONS)

    • 浏览器对复杂请求(如带自定义头的 POST)会先发送 OPTIONS 请求。
    • 确保后端正确处理 OPTIONS 方法(可通过全局配置或网关层实现)。
  3. 调试工具推荐

    • 浏览器开发者工具:查看 Console 和 Network 标签中的 CORS 错误信息。
    • Postman:验证接口是否正常工作(绕过浏览器限制)。
    • curl 命令:模拟跨域请求:
      curl -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: GET" -X OPTIONS http://localhost:8080/api/users
      
四、常见问题排查
  1. 配置未生效的可能原因

    • 未正确引入 WebMvcConfigurer 或 Spring Security 配置冲突。
    • 全局配置与 @CrossOrigin 注解混用时优先级问题(注解会覆盖全局配置)。
    • 缓存问题:浏览器可能缓存了旧的 CORS 响应头,需强制刷新(Ctrl + F5)。
  2. Spring Security 导致 CORS 失效

    • 检查安全配置中是否遗漏 .cors() 调用。
    • 确保 CorsConfigurationSource Bean 被正确注册。
  3. 携带 Cookie 时的特殊要求

    • 前端请求需设置 withCredentials: true(Axios 示例):
      axios.get('http://localhost:8080/api/data', { withCredentials: true });
      
    • 后端需配置 allowCredentials(true)allowedOrigins 不能为 *
五、进阶:CORS 与 CSRF 的协同配置

若同时启用 CSRF 保护(如表单提交场景):

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.cors().configurationSource(corsConfigurationSource()).and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and().authorizeRequests().anyRequest().authenticated();return http.build();}
}

关键点

  • 使用 CookieCsrfTokenRepository 将 CSRF Token 存储在 Cookie 中。
  • 前端需从 Cookie 读取 XSRF-TOKEN 并添加到请求头。
六、总结

通过合理选择注解配置、全局策略或网关层处理,Spring Boot 可以灵活解决各种跨域场景。关键点在于:

  1. 明确需求:区分开发环境与生产环境的配置严格性。
  2. 安全优先:避免过度开放权限,严格限制 allowedOrigins
  3. 全链路验证:结合浏览器工具和后端日志进行调试。

附录:官方文档参考

  • Spring CORS Documentation
  • MDN CORS Guide

希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis快速入门——实操

默认&#xff1a;电脑搭建好了Maven环境 本次入门实验使用的idea版本&#xff1a;ideaU2022.1 目录 一&#xff1a;前期准备工作 1. 创建一个springboot工程 2. Maven环境配置 3. 在mysql数据库中创建一个user表 4. 编写实体类User 二&#xff1a; 引入MyBatis的相关依赖…

IPLOOK超轻量核心网,助力5G专网和MEC边缘快速落地

随着5G深入千行百业&#xff0c;行业客户对核心网的灵活性、可控性和部署效率提出了更高要求。IPLOOK面向数字化转型需求&#xff0c;推出了超轻量级核心网解决方案&#xff0c;具备体积小、资源占用少、部署灵活、易于维护等特性&#xff0c;广泛适用于专网、实验室、MEC边缘云…

【前端】【HTML】【总复习】一万六千字详解HTML 知识体系

🌐 HTML 知识体系 一、HTML 基础入门 1. HTML 简介与作用 HTML(HyperText Markup Language,超文本标记语言)是构建网页的基础语言。它的核心作用是: 定义网页内容的结构(标题、段落、图片、表格等)提供语义化标签,帮助搜索引擎与辅助设备理解页面内容配合 CSS 实现…

VC++ 获取CPU信息的两种方法

文章目录 方法一&#xff1a;使用 Windows API GetSystemInfo 和 GetNativeSystemInfo (基本信息)编译和运行代码解释 方法二&#xff1a;使用 __cpuid&#xff08;CPU序列号、特性等&#xff09;代码解释&#xff1a; 开发过程中需要使用 VC获取电脑CPU信息&#xff0c;先总结…

Docker Compose 的历史和发展

这张图表展示了Docker Compose从V1到V2的演变过程&#xff0c;并解释了不同版本的Compose文件格式及其支持情况。以下是对图表的详细讲解&#xff1a; Compose V1 No longer supported: Compose V1已经不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …

24、TypeScript:预言家之书——React 19 类型系统

一、预言家的本质 "TypeScript是魔法世界的预言家之书&#xff0c;用静态类型编织代码的命运轨迹&#xff01;" 霍格沃茨符文研究院的巫师挥动魔杖&#xff0c;类型注解与泛型的星轨在空中交织成防护矩阵。 ——基于《国际魔法联合会》第12号类型协议&#xff0c;Ty…

(2025,AR,NAR,GAN,Diffusion,模型对比,数据集,评估指标,性能对比)文本到图像生成和编辑:综述

【本文为我在去年完成的综述&#xff0c;因某些原因未能及时投稿&#xff0c;但本文仍能为想要全面了解文本到图像的生成和编辑的学习者提供可靠的参考。目前本文已投稿 ACM Computing Surveys。 完整内容可在如下链接获取&#xff0c;或在 Q 群群文件获取。 中文版为论文初稿&…

MATLAB的cvpartition函数用法

1. 函数作用 cvpartition 将数据集划分为训练集和测试集&#xff0c;支持多种交叉验证方法&#xff0c;包括&#xff1a; Hold-Out验证&#xff1a;单次划分&#xff08;如70%训练&#xff0c;30%测试&#xff09;K折交叉验证&#xff1a;数据分为K个子集&#xff0c;依次用其…

Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析

目录 1.前言 2.正文 2.1状态码 2.2HTTP与HTTPS的关系 2.3SSL协议 2.3.1对称加密 2.3.2非对称加密 2.3.3中间人攻击 2.3.4校验机制 2.3.4.1证书 2.3.4.2数字签名 1. 数字签名的生成过程 2. 数字签名的验证过程 2.4TLS协议&#xff08;握手过程&#xff09; 3.小结…

代码随想录算法训练营第三十七天

LeetCode题目: 300. 最长递增子序列674. 最长连续递增序列718. 最长重复子数组2918. 数组的最小相等和(每日一题) 其他: 今日总结 往期打卡 300. 最长递增子序列 跳转: 300. 最长递增子序列 学习: 代码随想录公开讲解 问题: 给你一个整数数组 nums &#xff0c;找到其中最长…

【Java ee初阶】网络原理

TCP协议 1.确认应答 实现可靠传输的核心机制 2.超时重传 实现可靠传输的核心机制 3.连接管理 网络部分最高频的面试题 4.滑动窗口 提高传输效率的机制 5.流量控制 依据接收方的处理能力&#xff0c;限制发送方的发送速度。 6.拥塞控制 依据传输链路的处理能力&#xff0c…

B站取关脚本

个人的账号可能被盗了&#xff0c;发现关注数量蹦到3000多&#xff0c;然后b站没有一键取关的按钮&#xff0c;并且对api的访问有速度限制&#xff0c;然后网上的脚本很多都已经失效了&#xff0c;所以自己稍微写个简陋的 测试时间: 2025.05.11 使用步骤: 进入b站的关注页面…

PyGame游戏开发(含源码+演示视频+开结题报告+设计文档)

前言&#xff1a; 大二小学期python课上基于pygame做的一个游戏小demo&#xff0c;当时老师花了一天讲解了下python基础语法后&#xff08;也是整个大学四年唯一学习python的时间&#xff09;&#xff0c;便让我们自学网课一周然后交项目&#xff0c;所以做的非常仓促&#xff…

使用 React 实现语音识别并转换功能

在现代 Web 开发中&#xff0c;语音识别技术的应用越来越广泛。它为用户提供了更加便捷、自然的交互方式&#xff0c;例如语音输入、语音指令等。本文将介绍如何使用 React 实现一个简单的语音识别并转换的功能。 功能概述 我们要实现的功能是一个语音识别测试页面&#xff0…

C++ 双峰高斯函数拟合

C 双峰高斯函数拟合 一维高斯函数二维高斯函数多维高斯函数一维双峰高斯函数代码实现 二维双峰高斯函数代码实现 多维多峰高斯函数 在数据分析与清洗中经常遇到这样的数据&#xff1a;数据不仅仅向单个中心靠拢&#xff0c;而是类似分段的向两个甚至多个中心靠拢。数据向单个中…

【RP2350】香瓜树莓派RP2350之LED

本文最后修改时间&#xff1a;2025年05月10日 01:57 一、本节简介 本节以树莓派pico2开发板为例&#xff0c;举例如何写一个LED驱动加进工程里。 二、实验平台 1、硬件平台 1&#xff09;树莓派pico2开发板 ①树莓派pico2开发板&#xff08;作为仿真器&#xff09; ②micr…

机器人运动控制原理浅析-UC Berkeley超视觉模态模型

加州伯克利发布的超视觉多感知模态融合(FuSe, Fuse Heterogeneous Sensory Data)模型&#xff0c;基于视觉、触觉、听觉、本体及语言等模态&#xff0c;利用自然语言跨模态对齐(Cross-Modal Grounding)优调视觉语言动作等通用模型&#xff0c;提高模型任务成功率。 总体框架 …

【Bootstrap V4系列】学习入门教程之 组件-媒体对象(Media object)

Bootstrap V4系列 学习入门教程之 组件-媒体对象&#xff08;Media object&#xff09; 媒体对象&#xff08;Media object&#xff09;一、Example二、Nesting 嵌套三、Alignment 对齐四、Order 顺序五、Media list 媒体列表 媒体对象&#xff08;Media object&#xff09; B…

解决VirtualBox中虚拟机(ubuntu)与主机(windows)之间互相复制粘贴(文本)

一.开始的设置 1.在VirtualBox中打开设置&#xff0c;常规中修改主机与虚拟机交互设置 2.虚拟机关闭状态下&#xff0c;存储中选中控制器SATA&#xff0c;勾选‘使用主机输入输出’ 3.选中操作系统对应的虚拟文件&#xff0c;.vdi文件&#xff0c;勾选右边的固态驱动器。 4.启…

java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。

Java 在多核、多线程和高性能编程领域提供了丰富的现成框架和工具&#xff0c;既有标准库中的并发组件&#xff0c;也有第三方框架。以下是一些关键框架及其应用场景的总结&#xff1a;便于后面我们站在巨人的肩膀上&#xff0c;继续前行 一、Java 标准库中的多线程框架 Execut…