Spring MVC中跨域问题处理

在Spring MVC中处理跨域问题可以通过以下几种方式实现,确保前后端能够正常通信:


方法一:使用 @CrossOrigin 注解

适用于局部控制跨域配置,直接在Controller或方法上添加注解。

示例代码:
@RestController
@CrossOrigin(origins = "http://localhost:8080") // 允许指定源
public class MyController {@GetMapping("/data")public String getData() {return "Hello, CORS!";}
}
  • 参数说明
    • origins: 允许的源(多个用逗号分隔,或用 @CrossOrigin(origins = "*") 允许所有,但不推荐生产环境)。
    • methods: 允许的HTTP方法(如 RequestMethod.GET)。
    • allowedHeaders: 允许的请求头。
    • allowCredentials: 是否允许发送Cookie(需与前端配置一致)。

方法二:全局配置 WebMvcConfigurer

适用于全局跨域设置,统一管理所有接口的跨域规则。

步骤:
  1. 创建配置类实现 WebMvcConfigurer
  2. 重写 addCorsMappings 方法。
示例代码:
@Configuration
public class CorsGlobalConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 匹配所有路径.allowedOrigins("http://localhost:8080", "https://example.com").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedHeaders("*").allowCredentials(true).maxAge(3600); // 预检请求缓存时间(秒)}
}

方法三:使用 CorsFilter

通过自定义过滤器精细化控制跨域行为,适合复杂场景。

示例代码:
@Configuration
public class CorsFilterConfig {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.addAllowedOrigin("http://localhost:8080");config.addAllowedHeader("*");config.addAllowedMethod("*");source.registerCorsConfiguration("/**", config); // 对所有路径生效return new CorsFilter(source);}
}

方法四:结合 Spring Security

若项目集成了Spring Security,需额外配置安全规则以启用CORS。

步骤:
  1. 在安全配置类中启用CORS。
  2. 定义 CorsConfigurationSource Bean。
示例代码:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.cors().and() // 启用CORS.csrf().disable().authorizeRequests().anyRequest().authenticated();}@Beanpublic CorsConfigurationSource corsConfigurationSource() {CorsConfiguration config = new CorsConfiguration();config.setAllowedOrigins(Arrays.asList("http://localhost:8080"));config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));config.setAllowedHeaders(Arrays.asList("*"));config.setAllowCredentials(true);UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return source;}
}

方法五:通过 <mvc:cors> 命名空间配置全局跨域规则

在 Spring MVC 中,如果项目使用 applicationContext.xml 进行配置(基于 XML 的配置方式),这是最直接的 XML 配置方式,适用于全局跨域设置。

步骤:
  1. 确保 XML 文件头部声明了 mvc 命名空间

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
  2. <mvc:annotation-driven> 标签内配置跨域规则

    <mvc:annotation-driven><mvc:cors><!-- 配置全局跨域 --><mvc:mapping path="/**"allowed-origins="http://localhost:8080, https://example.com"allowed-methods="GET, POST, PUT, DELETE, OPTIONS"allowed-headers="Content-Type, Authorization"allow-credentials="true"max-age="3600"/></mvc:cors>
    </mvc:annotation-driven>
    
    • 参数说明
      • path: 匹配的 URL 路径模式(支持 Ant 风格,如 /api/**)。
      • allowed-origins: 允许的源(多个用逗号分隔)。
      • allowed-methods: 允许的 HTTP 方法。
      • allowed-headers: 允许的请求头。
      • allow-credentials: 是否允许发送 Cookie(对应 allowCredentials(true))。
      • max-age: 预检请求缓存时间(秒)。

方法六:通过自定义 CorsFilter Bean 配置

通过applicationContext.xml配置处理跨域问题时,如果需要对跨域行为进行更细粒度的控制(例如动态配置),可以手动注册 CorsFilter

步骤:
  1. applicationContext.xml 中定义 CorsFilter Bean

    <bean id="corsFilter" class="org.springframework.web.filter.CorsFilter"><constructor-arg><bean class="org.springframework.web.cors.UrlBasedCorsConfigurationSource"><property name="corsConfigurations"><map><entry key="/**"><bean class="org.springframework.web.cors.CorsConfiguration"><property name="allowedOrigins"><list><value>http://localhost:8080</value><value>https://example.com</value></list></property><property name="allowedMethods"><list><value>GET</value><value>POST</value><value>PUT</value><value>DELETE</value><value>OPTIONS</value></list></property><property name="allowedHeaders"><list><value>Content-Type</value><value>Authorization</value></list></property><property name="allowCredentials" value="true"/><property name="maxAge" value="3600"/></bean></entry></map></property></bean></constructor-arg>
    </bean>
    
  2. 确保 CorsFilter 优先执行
    web.xml 中,将 CorsFilter 注册为第一个 Filter:

    <filter><filter-name>corsFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping><filter-name>corsFilter</filter-name><url-pattern>/*</url-pattern>
    </filter-mapping>
    

完整示例:结合 applicationContext.xmlweb.xml

applicationContext.xml 配置:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 启用注解驱动并配置 CORS --><mvc:annotation-driven><mvc:cors><mvc:mapping path="/**"allowed-origins="http://localhost:8080"allowed-methods="GET, POST, PUT, DELETE"allowed-headers="Content-Type, Authorization"allow-credentials="true"max-age="3600"/></mvc:cors></mvc:annotation-driven></beans>
web.xml 配置(确保 Filter 顺序):
<filter><filter-name>corsFilter</filter-name><filter-class>org.springframework.web.filter.CorsFilter</filter-class>
</filter>
<filter-mapping><filter-name>corsFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

通过方式五和方式六,可以在基于 XML 的 Spring MVC 项目中灵活配置跨域规则。推荐使用 <mvc:cors> 命名空间配置,简单且直接;若需动态控制,则选择 CorsFilter

关键注意事项

  1. 预检请求(Preflight):浏览器会先发送 OPTIONS 请求检查服务器是否允许跨域。确保配置中包含 allowedMethods 并正确处理 OPTIONS
  2. 携带凭证(Cookies):若需传输Cookies,前端需设置 withCredentials: true,后端需设置 allowCredentials(true),且 allowedOrigins 不能为 *
  3. 生产环境安全:避免使用通配符 *,应明确指定允许的源、方法和头信息。
  4. allowedOrigins vs allowedOriginPatterns
    • 如果使用 Spring 5.3+,可以用 allowedOriginPatterns 支持通配符模式(如 http://*.example.com)。
    • XML 配置中需通过 <list> 手动指定具体域名。
  5. 与 Spring Security 集成
    • 如果项目集成了 Spring Security,需在安全配置中启用 CORS:
      <http auto-config="true" use-expressions="true"><cors/> <!-- 启用 CORS --><!-- 其他安全配置 -->
      </http>
      

通过上述方法,可灵活解决Spring MVC中的跨域问题,根据项目需求选择最合适的方案。

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

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

相关文章

基本句子结构

以下是英语句子五种基本结构的详细解释&#xff0c;并附上系动词的全面分类及示例&#xff1a; ​1. 主谓结构&#xff08;SV&#xff09;​ ​结构&#xff1a;主语&#xff08;Subject&#xff09; 不及物动词&#xff08;Intransitive Verb&#xff09;​核心&#xff1a;…

游戏引擎学习第264天:将按钮添加到分析器

回顾并为今天的工作做铺垫 随着时间的推移&#xff0c;我们的分析器&#xff08;profiler&#xff09;变得越来越强大。我通常会问大家是否记得我们要做什么&#xff0c;今天我们要做的似乎是按钮相关的功能。 今天的目标是实现按钮功能。我们从昨天留下的地方继续&#xff0…

大节点是选择自建机房还是托管机房

选择PCDN大节点自建机房还是托管机房&#xff0c;需综合考量资金实力、技术能力、运维需求、业务规模及合规要求。以下为具体分析&#xff1a; 自建机房的适用场景与考量因素 资金与技术门槛高 自建机房需投入服务器、存储、网络设备等硬件&#xff0c;以及机房建设、电力、散…

【SpringBoot】SpringBoot中使用AOP实现日志记录功能

前言一、AOP基本概念二、项目准备三、实现日志记录切面1、创建自定义日志注解2、实现日志切面3、配置AOP 四、使用示例1. 在Controller中使用2. 在Service中使用 六、高级配置1. 日志内容格式化2. 异步日志记录3. 日志脱敏处理 七、代理类生成的核心逻辑问题1&#xff1a; 既然…

linux中的常用命令(一)

目录 常用的快捷键 1- tab键:命令或者路径提示及补全&#xff1b; 2-ctrlc:放弃当前输入&#xff0c;终止当前任务或程序 3-ctrll;清屏 4-ctrlinsert:复制 5-鼠标右键:粘贴&#xff1b; 6-altc:断开连接/ctrlshift r 重新连接 7-alt1/2/3/等&#xff1a;切换回话窗口 8-上下键…

Pycharm(十九)深度学习

一、深度学习概述 1.1 什么是深度学习 深度学习是机器学习中的一种特殊方法,它使用称为神经网络的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,如图像、声音和文本。深度学习、机器学习和人工智能之间的关系如下图所…

多视图密集对应学习:细粒度3D分割的自监督革命

原文标题&#xff1a;Multi-view Dense Correspondence Learning (MvDeCor) 引言 在计算机视觉与图形学领域&#xff0c;3D形状分割一直是一个基础且具有挑战性的任务。如何在标注稀缺的情况下&#xff0c;实现对3D模型的细粒度分割&#xff1f;近期&#xff0c;斯坦福大学视觉…

Vue——前端vue3项目使用汉字转拼音

在 Vue3 项目中&#xff0c;可以通过以下 第三方 JavaScript 包 实现汉字转拼音。这些包均兼容 Vue3&#xff0c;且无需依赖后端处理&#xff1a; 推荐方案 1. pinyin-pro 特点&#xff1a;功能强大、支持多音字、声调、拼音匹配、轻量级&#xff08;~20KB&#xff09;。安装…

批量统计PDF页数,统计图像属性

软件介绍&#xff1a; 1、支持批量统计PDF、doc\docx、xls\xlsx页数 2、支持统计指定格式文件数量&#xff08;不填格式就是全部&#xff09; 3、支持统计JPG、JPEG、PNG图像属性 4、支持统计多页TIF页数、属性 5、支持统计PDF、JPG画幅 统计图像属性 「托马斯的文件助手」…

LeetCode 每日一题 2025/5/5-2025/5/11

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 5/5 790. 多米诺和托米诺平铺5/6 1920. 基于排列构建数组5/7 3341. 到达最后一个房间的最少时间 I5/8 3342. 到达最后一个房间的最少时间 II5/9 3343. 统计平衡排列的数目5…

pytest自动化测试执行环境切换的两种解决方案

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&#xff0c;比如多套测试环境、预上线环境、UAT环境、线上环…

visual studio 2015 安装闪退问题

参考链接&#xff1a; VS2012安装时启动界面一闪而过问题解决办法 visual studio 2015 安装闪退问题

RocketMQ Kafka区别

架构 ZooKeeper&#xff1a;管理 Broker 注册、分区 Leader 选举及消费者组状态。Broker&#xff1a;存储 Partition数据&#xff0c;每个 Partition 为独立日志文件。Producer/Consumer&#xff1a;通过 ZooKeeper获取路由信息&#xff0c;实现消息分发与消费。 NameServer&am…

MySQL进阶篇2_SQL优化、锁

文章目录 1 SQL优化1.1插入数据优化1.2主键优化页分裂页合并主键设计原则 1.3order by设计优化1.4group by设计优化小理解 1.5limit设计优化顺序IO和随机IO小疑惑 1.6count设计优化1.7update优化关于隐式事务事务的DML操作 锁全局锁表级锁表锁元数据锁意向锁 行级锁锁的释放条件…

如何测试 esp-webrtc-solution_solutions_doorbell_demo 例程?

软件准备 esp-webrtc-solution/solutions/doorbell_demo 例程 此例程集成了 WebSocket 传输视频流的应用 硬件准备 ESP32P4-Function-Ev-Board 环境搭建 推荐基于 esp-idf v5.4.1 版本的环境来编译此例程 若编译时出现依赖的组件报错&#xff0c;可进行如下修改&#xff…

TransmittableThreadLocal:穿透线程边界的上下文传递艺术

文章目录 前言一、如何线程上下文传递1.1 ThreadLocal单线程1.2 InheritableThreadLocal的继承困境1.3 TTL的时空折叠术 二、TTL核心设计解析2.1 时空快照机制2.2 装饰器模式2.3 采用自动清理机制 三、设计思想启示四、实践启示录结语 前言 在并发编程领域&#xff0c;线程上下…

【数据结构】——栈

一、栈的概念和结构 栈其实就是一种特殊的顺序表&#xff0c;其只允许在一端进出&#xff0c;就是栈的数据的插入和删除只能在一端进行&#xff0c;进行数据的插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循先进后出LIFO&#xff08;Last InFirst O…

大数据技术全景解析:Spark、Hadoop、Hive与SQL的协作与实战

引言&#xff1a;当数据成为新时代的“石油” 在数字经济时代&#xff0c;数据量以每年50%的速度爆发式增长。如何高效存储、处理和分析PB级数据&#xff0c;成为企业竞争力的核心命题。本文将通过通俗类比场景化拆解&#xff0c;带你深入理解四大关键技术&#xff1a;Hadoop、…

Android13 权限管理机制整理

一、概述 权限机制作为Android 系统安全的保证,很重要,这里整理一下 权限机制中framework 部分,selinux等其他的Android权限机制不在本次讨论范围内 二、个版本差异分类 Android13 Android12 Android11 及以下 抛开版本差异权限机制分为两大类 一类是之前apk在Android6.0…

MySQL的Order by与Group by优化详解!

目录 前言核心思想&#xff1a;让索引帮你“排好序”或“分好组”Part 1: ORDER BY 优化详解1.1 什么是 Filesort&#xff1f;为什么它慢&#xff1f;1.2 如何避免 Filesort&#xff1f;—— 利用索引的有序性1.3 EXPLAIN 示例 (ORDER BY) Part 2: GROUP BY 优化详解2.1 什么是…