[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.pswp.cn/bicheng/80615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80615.shtml
英文地址,請注明出處:http://en.pswp.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…