springboot的跨域是什么?遇到跨域問題如何解決?

在Spring Boot中,跨域是指當瀏覽器中的前端應用(如運行在某個域名和端口下的前端頁面)請求后端接口時,如果后端接口所在的域名、端口或協議與前端應用不一致,瀏覽器會阻止這種跨域請求。這是由于瀏覽器的同源策略(Same-Origin Policy)所導致的。

跨域產生的原因

瀏覽器出于安全性考慮,會阻止不同來源(域名、端口或協議不同)之間的請求

  • 同源策略限制:瀏覽器出于安全考慮,實施了同源策略,即只允許頁面請求同源(相同協議、域名和端口)的資源。當JavaScript發起的請求跨越了同源策略,即請求的目標與當前頁面的域名、端口、協議不一致時,瀏覽器會阻止請求的發送或接收。

  • 前后端分離架構:在現代的前后端分離開發模式下,前端和后端通常部署在不同的服務器上,具有不同的域名或端口,這很容易導致跨域問題。

例如:

  • 前端運行在 http://localhost:3000
  • 后端 API 在 http://localhost:8080

當前端向 http://localhost:8080/api/data 發送請求時,瀏覽器會攔截并報 CORS policy 錯誤。

解決跨域問題的常見方式

方式 1:使用 @CrossOrigin 注解(推薦小型項目或單個接口)

在 Spring Boot 控制器(@RestController)上使用 @CrossOrigin 注解,允許跨域訪問:

1) 允許所有來源訪問整個控制器
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "*")  // 允許所有來源
public class MyController {@GetMapping("/data")public String getData() {return "Hello, CORS!";}
}
2) 只允許特定的來源
@CrossOrigin(origins = "http://localhost:3000") // 只允許從 http://localhost:3000 訪問
@GetMapping("/data")
public String getData() {return "Hello, CORS!";
}
3) 細粒度控制(支持多個來源、方法、請求頭)
@CrossOrigin(origins = {"http://localhost:3000", "http://example.com"},methods = {RequestMethod.GET, RequestMethod.POST},allowedHeaders = {"Content-Type", "Authorization"})
@GetMapping("/data")
public String getData() {return "CORS Configured!";
}

方式 2:全局配置(推薦大型項目或所有接口都需要跨域)

如果所有 API 都需要支持跨域,使用 CorsFilterWebMvcConfigurer 進行全局配置。

2.1) 使用 WebMvcConfigurer 配置全局 CORS,@Configuration 類中注冊 CORS 規則:
  • 在Spring Boot應用中,可以通過創建一個配置類,實現WebMvcConfigurer接口,并重寫addCorsMappings方法來全局配置跨域訪問。這種方式適用于所有接口都需要跨域訪問的場景。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 允許所有路徑.allowedOrigins("http://localhost:3000") // 允許特定域訪問.allowedMethods("GET", "POST", "PUT", "DELETE") // 允許的請求方法.allowedHeaders("*") // 允許所有請求頭.allowCredentials(true); // 允許攜帶 Cookie}};}
}
  • addMapping("/**"):允許所有接口跨域
  • allowedOrigins("http://localhost:3000"):只允許 http://localhost:3000 訪問
  • allowedMethods("GET", "POST", "PUT", "DELETE"):允許這些 HTTP 方法
  • allowedHeaders("*"):允許所有請求頭
  • allowCredentials(true):允許攜帶 cookiesAuthorization

2.2) 使用 CorsFilter 配置 CORS

另一種方式是使用 CorsFilter,這種方式也是通過Java配置的方式配置跨域訪問,與全局配置CORS類似,但實現方式略有不同。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;import java.util.Arrays;@Configuration
public class MyCorsFilter {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowedOrigins(Arrays.asList("http://localhost:3000")); // 允許的前端地址config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));config.setAllowedHeaders(Arrays.asList("*"));config.setAllowCredentials(true); // 允許 Cookiesource.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}
  • setAllowedOrigins(Arrays.asList("http://localhost:3000")):指定允許的域
  • setAllowCredentials(true):允許帶 Cookies(必須與 allowedOrigins 不能設置為 "*"

方式3. 允許攜帶 Cookie

如果前端需要攜帶 cookieAuthorization 頭,例如 fetchAxios 發送請求時 credentials: 'include',你需要:

  1. 在后端 allowCredentials(true)
  2. 在前端請求時 credentials: 'include'

后端

registry.addMapping("/**").allowedOrigins("http://localhost:3000").allowedMethods("GET", "POST").allowCredentials(true);  // 允許攜帶 Cookie

前端(使用 Fetch)

fetch('http://localhost:8080/api/data', {method: 'GET',credentials: 'include' // 允許攜帶 Cookie
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

前端(使用 Axios)

axios.get('http://localhost:8080/api/data', { withCredentials: true }).then(response => console.log(response.data)).catch(error => console.error(error));

方式4. 通過Nginx配置CORS

如果項目中使用了Nginx作為反向代理服務器,也可以在Nginx中配置CORS來解決跨域問題。

server {...location / {add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Headers' '*';add_header 'Access-Control-Allow-Methods' '*';if ($request_method = 'OPTIONS') {return 204;}}...
}

通過以上方法,可以在Spring Boot應用中有效地解決跨域問題,確保前后端之間的正常通信。

常見 CORS 錯誤及解決方法

錯誤信息可能原因解決方案
Access to fetch at 'http://localhost:8080' from origin 'http://localhost:3000' has been blocked by CORS policy后端未配置 CORS配置 @CrossOriginWebMvcConfigurer
Response to preflight request doesn’t pass access control checkOPTIONS 請求被攔截在后端允許 OPTIONS 方法
Missing Allow-Control-Allow-Origin headerCORS 頭未返回確保后端 allowedOrigins 設置正確
credentials mode is 'include' but Access-Control-Allow-Credentials is missing需要攜帶 Cookie 但未允許在后端 allowCredentials(true)

總結

方法適用場景配置方式
@CrossOrigin適用于單個接口@RestController 或方法級別使用
WebMvcConfigurer適用于整個項目CorsRegistry 配置
CorsFilter高級定制使用 CorsConfiguration

在 Spring Boot 項目中,推薦使用 WebMvcConfigurer 進行全局跨域配置,@CrossOrigin 適用于局部控制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75754.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嘯叫抑制(AFS)從算法仿真到工程源碼實現-第八節-系統搭建

一、概述 系統分為錄音模塊、數據處理模塊、播音模塊。錄音模塊和播音模塊使用alsa庫進行讀寫數據。各模塊為獨立進程處理,模塊之間使用命名管道進行數據的傳輸。數據處理模塊我們使用基于頻域的自適應濾波去嘯叫算法。 二、工程實現 2.1 系統流程圖 2.2 錄音模塊…

HTML——什么是塊級元素,什么是內聯元素,有何區別

在 HTML 中,塊級元素(Block-level element)和內聯元素(Inline element)是兩種不同類型元素,它們在頁面布局和樣式應用方面有不同的行為和特性。 塊級元素(Block-level element) 塊級…

01 設計模式和設計原則

類設計原則: 單一職責原則(Single Responsibility Principle,SRP):實現類要職責單一開閉原則(Open Close Principle,OCP):對擴展開放,對修改關閉里氏替換原則…

【踩坑日記】springboot 打包后實現類無法找到

試過了所有改什么目錄 依賴 clean都以失敗告終 最后將實現類的文件名從Impl改成impl宣布成功 記得使用idea自帶的重構

項目-蒼穹外賣(十五) WebSocket+語音播報功能實現(來訂單+催單)

一、介紹 二、入門案例 配置類: package com.sky.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter;/…

【Spring篇】Spring的生命周期

一、Bean 生命周期的核心階段 1. 實例化(Instantiation) ? 觸發時機:容器啟動時(單例 Bean)或請求時(原型 Bean)。 ? 實現方式: 通過反射(Class.newInstance() 或構造…

Redis、Memcached應用場景對比

環境 Redis官方網站: Redis - The Real-time Data Platform Redis社區版本下載地址:Install Redis | Docs Memcached官方網站:memcached - a distributed memory object caching system Memcached下載地址:memcached - a dis…

kettle插件-mysql8數據庫插件

場景:群里有小伙伴反饋kettle 7.x版本不能自動連接mysql8,安排!!! 1、將mysql8的驅動包mysql-connector-java-8.0.20.jar丟到kettle的lib目錄下,重啟spoon。 2、配置數據庫連接,提示驅動類不對…

【軟件測試】:軟件測試實戰

1. ?動化實施步驟 1.1 編寫web測試?例 1.2 ?動化測試腳本開發 common public class AutotestUtils {public static EdgeDriver driver;// 創建驅動對象public static EdgeDriver createDriver(){// 驅動對象已經創建好了 / 沒有創建if( driver null){driver new EdgeDr…

深度學習入門1 基于Python的理論與實現

torch.unsqueeze()將一維數據變為二維數據,torch只能處理二維數據 tensor不能反向,variable可以反向。variable.data.numpy()轉換為numpy 第3章 神經網絡 實現softmax函數時的注意事項:為防止e的指數運算造成溢出 矩陣的第 0 維是列方向,第…

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤 在使用 Pentaho Data Integration(也稱為 Kettle)進行數據集成和ETL開發時,開發者可能會遇到各種依賴沖突和技術挑戰。本文將詳細介紹一個常見的錯…

第 五 章:優化算法_《C++性能優化指南》_notes

優化算法 第五章重難點詳解與代碼實戰編譯與測試說明第五章核心知識點整理重難點梳理 第一部分:多選題(10道)第二部分:設計題(5道)答案與詳解多選題答案: 設計題參考實現(以題目2為例…

多版本PHP開發環境配置教程:WAMPServer下MySQL/Apache/MariaDB版本安裝與切換

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、版本切換指南總結 前言 由于有幾個項目分別使用到PHP7.0 和7.4以及8.0版本,設置mysql也會根據PHP版本使用不同的版本,于是開始研究…

2024年數維杯數學建模C題天然氣水合物資源量評價解題全過程論文及程序

2024年數維杯數學建模 C題 天然氣水合物資源量評價 原題再現: 天然氣水合物(Natural Gas Hydrate/Gas Hydrate)即可燃冰,是天然氣與水在高壓低溫條件下形成的類冰狀結晶物質,因其外觀像冰,遇火即燃&#…

階段一:Java基礎語法

目標:掌握Java的基本語法,理解變量、數據類型、運算符、控制結構等。 1. Java開發環境搭建 安裝JDK配置環境變量編寫第一個Java程序 代碼示例: // HelloWorld.java public class HelloWorld { // 定義類名為 HelloWorldpublic static vo…

從0到1,解鎖Ant Design X的無限可能

Ant Design X 是什么? 在人工智能飛速發展的當下,AI 驅動的界面已成為軟件開發的重要趨勢。而 Ant Design X 正是順應這一趨勢,于 2024 年應運而生的一款遵循 Ant Design 設計體系的 React UI 庫,它旨在幫助開發者輕松打造 AI 驅…

Graphpad Prism for Mac醫學繪圖

Graphpad Prism for Mac醫學繪圖 文章目錄 Graphpad Prism for Mac醫學繪圖一、介紹二、效果三、下載 一、介紹 GraphPad Prism for Mac是一款功能強大、易于使用的科學和統計分析軟件,適用于各種類型的數據處理和可視化需求。無論您是進行基礎研究、臨床試驗還是學…

mysqloracledb2 (uuid函數)

項目場景: 創建一個32位的UUID 問題描述 原因分析: 解決方案: mysql內置UUID函數 SELECT UUID(); SELECT UUID_SHORT();oracle內置UUID函數 SELECT sys_guid() FROM dual;db2,模擬UUID函數 SELECT TEST || substr (CONCAT…

Android實踐開發制作小猴子摘桃小游戲

Android實踐制作小猴子摘桃小游戲 實踐素材項目源文件獲取:Android可能存在版本差異項目如果不能正確運行,可以使用里面的素材自己構建項目Android實踐制作小猴子摘桃小游戲Android實踐制作小猴子摘桃小游戲https://mp.weixin.qq.com/s/jNU_hVfj9xklsil…

Postman 下載文件指南:如何請求 Excel/PDF 文件?

在 Postman 中進行 Excel/PDF 文件的請求下載和導出,以下是簡明的步驟,幫助你輕松完成任務。首先,我們將從新建接口開始,逐步引導你完成整個過程。 Postman 請求下載/導出 excel/pdf 文件教程