后端解决跨域问题的三种方案:注解配置 vs 全局配置 vs 过滤器配置(附完整代码详解)

article/2025/6/6 2:10:41

文章目录

    • 一、引言:跨域问题的本质与解决方案分类
      • 解决方案分类
    • 二、方案一:`WebMvcConfigurer` 全局配置(推荐)
      • 1. 核心代码(你提供的 `CorsConfig` 示例)
      • 2. 代码详解
      • 3. 优点
      • 4. 注意事项
    • 三、方案二:`CorsFilter` 过滤器配置(传统方式)
      • 1. 核心代码(你提供的 `ResourcesConfig` 示例)
      • 2. 代码详解
      • 3. 优点
      • 4. 注意事项
    • 四、方案三:`@CrossOrigin` 注解配置(局部控制)
      • 1. 核心代码
      • 2. 代码详解
      • 3. 优点
      • 4. 缺点
    • 五、三种方案的对比与选择建议
    • 六、安全最佳实践
      • 1. 禁用危险组合
      • 2. 细化允许的 Header 和 Method
      • 3. HTTPS 强制要求
      • 4. 预检请求(OPTIONS)处理
    • 七、附录:完整配置示例(结合三种方案)
      • 1. `WebMvcConfigurer` 分层配置
      • 2. `CorsFilter` 过滤器配置
      • 3. `@CrossOrigin` 注解配置

一、引言:跨域问题的本质与解决方案分类

在前后端分离开发中,跨域问题是开发者必须面对的核心挑战之一。浏览器的同源策略(Same-Origin Policy)会拦截不同协议(HTTP/HTTPS)、不同域名或不同端口的请求,导致如下错误:

Access to fetch at 'http://api.example.com' from origin 'http://localhost:3000' has been blocked by CORS policy.

解决方案分类

  1. 注解配置:通过 @CrossOrigin 注解实现局部接口的跨域控制。
  2. 全局配置:通过 WebMvcConfigurer 统一管理所有接口的跨域规则。
  3. 过滤器配置:通过 CorsFilter 实现基于 Servlet 的低层跨域控制。

本文将结合你提供的两个代码片段(CorsConfigResourcesConfig),深入解析其原理,并补充第三种方案(@CrossOrigin 注解),帮助你全面掌握跨域问题的解决方案。


二、方案一:WebMvcConfigurer 全局配置(推荐)

1. 核心代码(你提供的 CorsConfig 示例)

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH").maxAge(3600);}
}

2. 代码详解

  • addMapping("/**")
    对所有路径(/**)启用跨域配置。
  • allowedOriginPatterns("*")
    允许任意域名访问(通配符 *)。注意:若启用 allowCredentials(true),必须明确指定域名,不能使用 *
  • allowCredentials(true)
    允许客户端携带 Cookie 或 Token 等凭证(需与 allowedOrigins 严格匹配,否则会引发安全漏洞)。
  • allowedMethods(...)
    明确允许的 HTTP 方法(如 GET、POST 等)。
  • maxAge(3600)
    预检请求(OPTIONS)的缓存时间,单位为秒(3600 = 1小时)。

3. 优点

  • 集中管理:统一配置所有接口的跨域规则。
  • 路径分层控制:支持对不同路径设置不同策略(如 /public/** 允许所有来源,/private/** 限制来源)。
  • Spring MVC 原生支持:与 Spring Boot 深度集成,无需额外依赖。

4. 注意事项

  • 避免 allowedOriginPatterns("*") + allowCredentials(true):此组合可能导致 CSRF 攻击。
  • 版本兼容性allowedOriginPatterns(...) 是 Spring 5.3+ 引入的方法,低版本需改用 allowedOrigins(...)

三、方案二:CorsFilter 过滤器配置(传统方式)

1. 核心代码(你提供的 ResourcesConfig 示例)

@Configuration
public class ResourcesConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 资源映射配置(可选)}/*** 跨域配置*/@Beanpublic CorsFilter corsFilter(

http://www.hkcw.cn/article/rCoRFnjYQW.shtml

相关文章

ES的开始

ES作用 在海量数据中,执行搜索功能,使用mysql,效率过低, 如果关键字输入不准确,一样可以搜索到想要的数据 讲搜索关键字,以红色字体展示 ES介绍 ES是基于java语言并且基于Lucene编写的搜索引擎框架&#x…

【论文解读】ReAct:从思考脱离行动, 到行动反馈思考

认识从实践开始,经过实践得到了理论的认识,还须再回到实践去。 ——《实践论》,毛泽东 1st author: About – Shunyu Yao – 姚顺雨 paper [2210.03629] ReAct: Synergizing Reasoning and Acting in Language ModelsReAct: Synergizing Reasoning and…

AXURE-动态面板

1.概述 动态面板原件,容器类的原件一个动态面板可以有多种状态 同一时刻只展示一个状态 默认展示第一个状态 主要用于多个状态的切换可拖动 1.1 创建 将原件库中的“动态面板”原件,直接拖动到工作区中,创建空白动态面板将页面中原件选中…

AI地面垃圾检测算法智能分析网关V4打造城市/公园/校园等场景环保卫生监管解决方案

一、方案背景​ 在城市管理与场所运营中,地面垃圾的及时清理是环境品质的重要指标。传统人工巡检效率低、成本高,存在明显滞后性,难以满足现代环境管理需求。随着人工智能与计算机视觉技术发展,智能化管理成为趋势。AI智能分析网…

帝国CMS QQ登录插件最新版 获取QQ头像和QQ昵称

帝国CMS QQ登录插件最新版 获取QQ头像和QQ昵称 QQ一键登录,免邮箱 随机密码 获取QQ头像 获取QQ昵称 直接下载上传到帝国CMS:/e/memberconnect UTF-8版本 GBK的自己转换 QQ登录后的默认密码 是随机的邮箱账号前面的随机6个字母和数字 【下图字母数…

Kafka 的优势是什么?

Kafka 作为分布式流处理平台的核心组件,其设计哲学围绕高吞吐、低延迟、高可扩展性展开,在实时数据管道和大数据生态中具有不可替代的地位。 一、超高吞吐量与低延迟 1. 磁盘顺序 I/O 优化 突破磁盘瓶颈:Kafka 将消息持久化到磁盘&#xff…

低谷才是出成绩

有些朋友说我现在是高光,其实不然 之所以有这样的误解,是我个人的简历上是不断增加名誉。这点属实,看看我的词条:https://www.modb.pro/wiki/4245的确如此。但是其实也有误会。事情可以反过来看。因为,如果做技术的在…

Bash shell四则运算

文章目录 四则运算1. ‌expr 命令‌2. ‌$(( )) 表达式(推荐)‌3. ‌$[ ] 表达式(已弃用)‌4. ‌let 命令‌小数运算i 和 i 区别 四则运算 算术运算: - * / %(取模,求余数) Bash sh…

Windows + CPU也能跑时序预测:TSLib框架快速上手与踩坑避雷

在时序预测领域,选择一个成熟的框架往往能让我们事半功倍。最近接手了一个紧急的时序预测项目,经过一番调研后,我选择了TSLib(Time-Series-Library)这个优秀的开源框架来快速搭建整个预测流程。 由于开发环境限制在Windows平台且没有GPU支持,整个部署过程还是遇到了一些…

多模态大语言模型arxiv论文略读(105)

UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ➡️ 论文标题:UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ➡️ 论文作者:Zhaowei…

set map数据结构

#include <set> #include <iostream> using namespace std;int main() {// 设置控制台输出编码为UTF-8system("chcp 65001");set<int> s1; // 创建一个整数集合// 插入元素s1.insert(5);s1.insert(3);s1.insert(7);s1.insert(1);s1.insert(9);//默…

云开发实现新闻列表小程序

新闻列表小程序需要两个页面即新闻列表页及新闻发布页&#xff0c;这两个页面需要以tabBar的形式展示&#xff0c;单击tab图标可以进行页面相互切换。本项目中是分别在cloudfunctions中创建一个名为“submit”的云函数&#xff0c;功能为向小程序端发布信息&#xff0c;在pages…

《C++ Core Guidelines解析》深入理解C++

前言 在计算机编程领域&#xff0c;C一直以其高效、灵活和强大而闻名。然而&#xff0c;C作为一种复杂的编程语言&#xff0c;如果没有正确的理解和使用&#xff0c;很容易导致软件质量的下降和性能问题的出现。幸运的是&#xff0c;一本名为《CCore Guidelines解析》的书籍为…

报错:Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes beca

问题描述&#xff1a;运行单元测试时&#xff0c;报这个警告&#xff1a;Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes beca 操作步骤如下&#xff1a; 将原来的&#xff1a;-ea 修改为 -ea -Xshare:off 重新启动单元测试&a…

万字详解CSS动画核心——@keyframes,看完就会做动画!

新手福利 -- 还在为CSS动画发愁&#xff1f;一篇搞定keyframes所有知识点&#xff01; 一、什么是keyframes&#xff1f; ‌简单说‌&#xff1a;keyframes 是CSS3的 ‌动画关键帧规则‌&#xff0c;就像导演给动画片分镜头一样&#xff0c;你可以定义动画在不同时间点的样式…

【氮化镓】GaN HMETs器件物理失效分析进展

2021 年 5 月,南京大学的蔡晓龙等人在《Journal of Semiconductors》期刊发表了题为《Recent progress of physical failure analysis of GaN HEMTs》的文章,基于多种物理表征技术及大量研究成果,对 GaN HEMTs 的常见失效机制进行了系统分析。文中先介绍失效分析流程,包括使…

工业智能网关保障冷冻仓储设备无人值守安全运行

一、项目背景 冷链物流行业在近年来发展迅速&#xff0c;冷库作为其中的关键环节&#xff0c;其制冷设备的稳定运行至关重要。传统的冷库制冷设备监控方式存在诸多弊端&#xff0c;如需要人工现场巡检&#xff0c;不仅效率低下&#xff0c;且难以及时发现问题&#xff1b;数据…

电工基础【5】简单的电路设计接线实操

07 简单的电路设计 传送带控制示例图 传送带可以转的&#xff0c;电机带动它转。好&#xff0c;这红色的是停止按钮。绿色1启动按钮&#xff0c;这是自锁电路。 原本绿色1启动按钮(按下转、松开转) 客户想加个绿色2手动按钮(按下停、松开转)。 我们前面也学过那个点动了&#…

手机上网可以固定ip地址吗?详细解析

在移动互联网时代&#xff0c;手机已成为人们日常上网的主要设备之一。无论是工作、学习还是娱乐&#xff0c;稳定的网络连接都至关重要。许多用户对IP地址的概念有所了解&#xff0c;尤其是固定IP地址的需求。那么&#xff0c;手机上网能否固定IP地址&#xff1f;又该如何实现…

QGIS 矢量数据属性表中文乱码解决方案:4 步修复编码匹配问题

在QGIS中导入矢量数据后&#xff0c;属性表出现中文字符乱码&#xff0c;多由字符编码不匹配导致。以下是条理清晰的解决方案&#xff0c;可整理为博客内容&#xff1a; 目录 一、问题根源&#xff1a;编码不匹配二、解决方案&#xff1a;分场景修复编码1. 图层属性修改编码&am…