前端的跨域問題

前端新手也能看懂的跨域問題詳解

在前端開發中,我們經常會聽到“跨域問題”。尤其是在本地調試前端和后臺接口時,瀏覽器突然拋出一堆報錯信息,比如:

Access to XMLHttpRequest at '[http://api.xxx.com/data](http://api.xxx.com/data)' from origin '[http://localhost:8080](http://localhost:8080)' has been blocked by CORS policy...

這到底是什么鬼?別慌,今天我們就一口氣搞清楚什么是跨域、為什么會出現跨域、怎么解決跨域!


一、什么是“跨域”?

跨域指的是:瀏覽器因為安全限制,阻止了網頁對不同源(域名/IP/端口號不同)的請求

所謂“”,就是由以下三部分組成的:

  • 協議(http/https)
  • 域名(或IP)
  • 端口號

只要其中任意一項不同,就叫做“不同源”,比如:

地址http://localhost:8080 比較是否同源
http://localhost:8080完全相同同源
http://localhost:3000端口不同跨域
https://localhost:8080協議不同跨域
http://127.0.0.1:8080IP不同跨域
http://api.example.com域名不同跨域

二、為什么會有跨域限制?

這是瀏覽器的同源策略(Same-Origin Policy)在起作用。

這個策略是為了保護用戶的信息安全,防止惡意網站讀取你在其他網站上的隱私數據(比如你登陸了 A 網站,但正在訪問 B 網站,B 網站偷偷用 JS 請求 A 網站獲取你的個人信息,這就很危險了)。

所以,瀏覽器默認就限制了跨域請求


三、哪些操作會觸發跨域?

最常見的觸發方式是通過前端的 JavaScript 發送請求,例如:

fetch('http://api.xxx.com/data') // 如果地址和頁面地址不是同源,就會被攔截

其他還有:

  • 使用 XMLHttpRequestaxios
  • 頁面內嵌 iframe
  • 加載外部的腳本、字體、樣式(但有些資源不受限制)

四、怎么解決跨域問題?

跨域不是不能請求,而是默認不允許。我們可以通過一些方式讓瀏覽器**“信任”**這次跨域請求。

方法一:CORS(跨源資源共享)【推薦】

這是最常見也最官方的方式。

需要后端在響應頭中加上允許跨域的字段:

Access-Control-Allow-Origin: http://localhost:8080

如果允許所有域訪問,也可以寫:

Access-Control-Allow-Origin: *

完整示例(Node.js Express 后端):

app.use((req, res, next) => {res.setHeader('Access-Control-Allow-Origin', '*'); // 允許所有域訪問res.setHeader('Access-Control-Allow-Methods', 'GET,POST'); // 允許的方法res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); // 允許的請求頭next();
});

方法二:通過代理繞過瀏覽器

在開發環境中,你也可以設置一個本地代理,讓瀏覽器以為你訪問的是同源。

比如用 vitewebpack 設置代理:

// vite.config.js
export default {server: {proxy: {'/api': {target: 'http://api.xxx.com',changeOrigin: true,rewrite: path => path.replace(/^\/api/, '')}}}
}

你在前端請求 /api/data,實際上是請求 http://api.xxx.com/data,從而繞過跨域限制

方法三:JSONP(已過時,只支持GET)

是一種早期的跨域方案,用 <script> 標簽加載數據,原理是瀏覽器允許跨域加載 JS 文件。但現在一般不推薦,功能有限,且不支持 POST。


五、總結一句話

跨域問題是瀏覽器安全機制限制的結果,我們可以通過配置 CORS 或使用代理來解決。


FAQ:你可能還想問

  • 跨域只在瀏覽器中出現嗎?
    是的,Node.js 端、Postman、curl 請求都不會受到“同源策略”的影響。

  • 后端一定要支持 CORS 嗎?
    如果你要前端直接訪問后端 API,那后端必須支持;否則只能通過代理。

  • 是不是所有請求都會被預檢?
    不是,簡單請求不會,比如 GET 請求且 Content-Type 是 application/x-www-form-urlencoded

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

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

相關文章

TCP 連接在異常情況下的斷開機制

文章目錄 一、進程(客戶端)被 kill 掉1、kill [-15]2、kill -9 二、進程(客戶端) core 掉 一、進程(客戶端)被 kill 掉 詳細驗證流程 1、kill [-15] 2、kill -9 二、進程(客戶端) core 掉

【甲方安全建設】持續滲透測試(一)

持續滲透測試是一種現代安全方法&#xff0c;它對針對組織數字資產的網絡攻擊進行實時或近實時模擬&#xff0c;確保在漏洞出現時識別并解決漏洞… 文章目錄 行業洞察持續滲透測試不是什么&#xff1f;1. 非單一自動化漏洞掃描2. 非傳統人工滲透測試的替代品3. 非萬能解決方案4…

LOCAL PATTERNS GENERALIZE BETTER FOR NOVEL ANOMALIES

標題&#xff1a;局部模式在新穎異常上的泛化能力更強 原文鏈接&#xff1a;https://openreview.net/forum?id4ua4wyAQLm 源碼鏈接&#xff1a;https://github.com/AllenYLJiang/Local-Patterns-Generalize-Better/ 發表&#xff1a;ICLR-2025 摘要 視頻異常檢測&#xff08;…

ABP vNext + Azure Application Insights:APM 監控與性能診斷最佳實踐

ABP vNext Azure Application Insights&#xff1a;APM 監控與性能診斷最佳實踐 &#x1f680; &#x1f4da; 目錄 ABP vNext Azure Application Insights&#xff1a;APM 監控與性能診斷最佳實踐 &#x1f680;1?? 集成目標與環境要求 2?? 安裝 SDK 與注入服務 3?? 日…

OPENGLPG第九版學習 - 紋理與幀緩存 part1

文章目錄 6.1 紋理綜述6.2 基木紋理類型6.3 創建并初始化紋理代理紋理 6.4 指定紋理數據6.4.1 顯式設置紋理數據將靜態數據載入到紋理對象 6.4.2 從緩存(目標對象GL_PIXEL_UNPACK_BUFFER)中加載紋理6.4.3 從文件加載圖像(DDS為例)讀取一個圖像文件并返回內存中的紋素數據將紋素…

誰來定義未來座艙?新一代車載顯示「C位」之戰開啟

在汽車智能網聯化轉型過程中&#xff0c;車載顯示屏幕作為人車交互的重要載體&#xff0c;已經站上了迅猛發展的新起點。 一方面&#xff0c;伴隨著汽車智能化的加速滲透與發展&#xff0c;傳統中控屏與儀表顯示屏的單一顯示模式已經難以匹配智能化交互需求&#xff0c;車載顯…

基于JavaScript的MQTT實時通信應用開發指南

MQTT 協議入門與實踐&#xff1a;使用 JavaScript 構建實時通信應用 1. 什么是 MQTT&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一種輕量級的 發布/訂閱&#xff08;Pub-Sub&#xff09; 消息協議&#xff0c;專為低帶寬、高延遲或不穩…

React 19中如何向Vue那樣自定義狀態和方法暴露給父組件。

文章目錄 前言一、什么是 useImperativeHandle&#xff1f;1.1 為什么需要 useImperativeHandle&#xff1f;1.2 基本語法 二、useImperativeHandle 的常見用法3.1 暴露自定義方法3.2子組件封裝的彈窗關閉方法暴露給外部 注意點&#xff1a;總結 前言 在 React 的函數組件中&a…

Windows定時關機工具

自己設計了一款簡單易用的windows定時關機工具&#xff0c;使用簡單&#xff0c;使用只需兩步&#xff1a; 1、輸入設定的時間 2、點擊開始計時 Ps: 1、文章頂部直接下載exe文件 2、文件設置不了免費下載&#xff0c;只能用云盤&#xff1a;定時關機工具.exe - 藍奏云。 w…

楓清科技受邀參加2025數據智能大會

近日&#xff0c;由中國通信標準化協會主辦&#xff0c;中國信通院、大數據技術標準推進委員會(CCSA TC601)承辦的“2025數據智能大會”在北京隆重召開&#xff0c;本屆大會以“Data X AI&#xff0c;數據燃動智能”為主題&#xff0c;聚焦央國企數智化轉型、下一代數據治理、數…

黑馬頭條-數據管理平臺

目錄 項目介紹 功能 項目準備 技術 驗證碼 驗證碼登錄 驗證碼登錄-流程 關于token token的介紹 token的使用 個人信息設置 個人信息設置和axios請求攔截器 axios響應攔截器和身份驗證失敗 優化-axios響應結果 發布文章 發布文章-富文本編輯器 發布文章-頻道列…

Pytorch3D 中涉及的知識點匯總

PyTorch3D 是 Facebook&#xff08;現 Meta&#xff09;AI 研究院&#xff08;FAIR&#xff09;推出的一個基于 PyTorch 的三維計算庫&#xff0c;主要用于 3D 計算機視覺與圖形學任務&#xff0c;如 3D 重建、渲染、點云處理、網格操作等。 下面是對 PyTorch3D 中重要涉及知識…

XML在線格式化工具

XML格式化 免費在線XML格式化與壓縮工具&#xff0c;一鍵美化、校驗、壓縮和優化您的XML代碼。支持自定義縮進、節點折疊&#xff0c;提升可讀性&#xff0c;減小文件體積&#xff0c;加速數據傳輸。 https://toolshu.com/xml 本工具是一款專為處理XML&#xff08;可擴展標記…

【軟件系統架構】系列四:嵌入式技術

目錄 一、嵌入式系統組成 (1)嵌入式處理器 (2)支撐硬件 (3)嵌入式操作系統 (4)支撐軟件 (5)應用軟件 二、嵌入式系統特性 三、嵌入式系統分類與分層結構 1.分類 2.嵌入式軟件的五層架構深入解析 (1)硬件層(Hardware Layer) (2)抽象層(Hardware Ab…

監管報送面試回答思路和示例

在銀行監管報送崗位的面試中&#xff0c;回答問題時需要展現出你的專業知識、實際操作經驗、問題解決能力以及對監管合規的重視。以下是對各類問題的回答思路和示例&#xff1a; 一、專業知識類問題 1. 請簡述銀行監管報送的主要類型和報送頻率 回答思路&#xff1a;分類介紹…

音視頻SDK架構演進的實踐與思考

“不是每一行代碼都值得驕傲&#xff0c;但每一次迭代&#xff0c;都是一次更接近極致的嘗試。” 從最初的數千行代碼、到如今跨平臺、全功能、穩定可靠的直播技術基座&#xff0c;大牛直播SDK走過了整整十年。十年&#xff0c;既是時間的刻度&#xff0c;更是技術沉淀與產品信…

vue.config.js配置學習

1.部署應用包時的基本 URL (baseUrl或publicPath) baseUrl在vue-cli 3.3 時棄用了&#xff0c;自此之后使用publicPath 默認&#xff1a;/ module.exports {// baseUrl:"/",publicPath: ./, ) 2.打包時輸出的文件位置&#xff1a;outputDir 默認: dist module.…

大模型——Prompt Design

Prompt Design 為什么未來最重要的寫作,不是寫給人看的,而是寫給AI理解的? 01|一切從一次“客服神操作”開始 前幾天前,我在看一場 YC Demo Day 分享的時候,聽到一個很炸裂的細節: 有個叫 Parahelp 的 AI 客服創業項目,靠一段幾百行的“提示詞”,打敗了市面上大多數…

web布局20

在當下&#xff0c;可用于 Web 布局的 CSS 特性有很多&#xff0c;而且這個集合越來越強大。自從 Flexbox 的兼容性越來越完善&#xff0c;它替代了浮動布局&#xff0c;成為主流的布局技術。只不過&#xff0c;近幾年來&#xff0c;CSS Grid 快速得到主流瀏覽器的支持&#xf…

數據集-目標檢測系列- 餐具叉子 數據集 fork >> DataBall

數據集-目標檢測系列- 餐具叉子 數據集 fork &#xff1e;&#xff1e; DataBall 貴在堅持&#xff01; * 相關項目 1&#xff09;數據集可視化項目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;數據集訓練、推理相…