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.pswp.cn/pingmian/80259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80259.shtml
英文地址,請注明出處:http://en.pswp.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 什么是…