跨域問題全解:從原理到實戰

在計算機網絡中,跨域(Cross-Origin) 指的是瀏覽器出于安全考慮,限制網頁腳本(如 JavaScript)向與當前頁面不同源(Origin) 的服務器發起請求的行為。這是由瀏覽器的同源策略(Same-Origin Policy) 強制實施的安全機制。


核心概念詳解

1. 什么是“源”(Origin)?

“源”由三部分組成:

  • 協議(Protocol):如 http://https://
  • 域名(Domain):如 example.com
  • 端口(Port):如 :80(默認端口可省略)

例如:

  • https://www.example.com:443https://www.example.com 同源(端口隱式相同)。
  • http://api.example.comhttp://www.example.com 不同源(子域名不同)。
  • https://example.comhttp://example.com 不同源(協議不同)。
2. 同源策略的限制范圍

當腳本嘗試訪問不同源的資源時,瀏覽器會攔截以下操作:

  • AJAX / Fetch 請求:禁止讀取跨域請求的響應(但請求可能實際已發送到服務器)。
  • WebSocket 連接:部分瀏覽器限制跨域 WebSocket。
  • DOM 訪問:禁止通過 iframe 操作跨域頁面的 DOM。
  • Cookie/LocalStorage:禁止讀取跨域站點的存儲數據。

為什么需要跨域限制?

  1. 防御惡意攻擊

    • CSRF(跨站請求偽造):阻止惡意網站利用用戶登錄態偽造請求(同源策略本身不足以防 CSRF,需配合其他機制如 Token)。
    • 數據竊取:防止惡意腳本讀取用戶在其他站點的敏感數據(如銀行頁面內容)。
  2. 保護用戶隱私
    避免網站通過腳本非法獲取用戶在其他站點的登錄狀態或歷史記錄。


如何解決跨域問題?

開發者可通過以下方式安全地實現跨域通信:

1. CORS(跨域資源共享) 🌟(主流方案)
  • 原理:服務器在響應頭中聲明允許哪些源訪問資源。
  • 示例響應頭
    Access-Control-Allow-Origin: https://www.yoursite.com  // 允許特定源
    Access-Control-Allow-Methods: GET, POST, PUT          // 允許的請求方法
    Access-Control-Allow-Headers: Content-Type            // 允許的請求頭
    
  • 預檢請求(Preflight):對復雜請求(如帶自定義頭),瀏覽器先發 OPTIONS 請求確認權限。
2. JSONP(JSON with Padding)(傳統方案)
  • 原理:利用 <script> 標簽不受同源策略限制的特性,通過回調函數獲取數據。
  • 缺點:僅支持 GET 請求,安全性低(需信任服務器)。
3. 代理服務器(Proxy)
  • 原理:將跨域請求轉發到同源服務器,由服務器代為請求目標資源。
  • 適用場景:前端開發中常用 webpack-dev-server 代理解決本地開發跨域。
4. WebSocket
  • 特點:不受同源策略限制,適用于雙向實時通信。
5. 修改域名(同源化)
  • 將前端頁面和后端 API 部署在同一域名下(如 www.example.comapi.example.com → 通過 DNS 解析為同域)。

真實場景示例

// 前端嘗試請求跨域 API
fetch('https://api.weather.com/data').then(response => response.json()).catch(error => console.error('跨域請求被攔截!'));// 瀏覽器報錯:
// Access to fetch at 'https://api.weather.com/data' from origin 'https://your-site.com'
// has been blocked by CORS policy.

解決方案
API 服務器需添加響應頭:

Access-Control-Allow-Origin: https://your-site.com

重要注意事項

  • 跨域是瀏覽器行為:Postman、curl 等工具不受同源策略限制。
  • 簡單請求 vs 預檢請求:GET/POST 帶標準頭屬于簡單請求,直接發送;帶自定義頭會觸發預檢。
  • Cookie 跨域:需設置 withCredentials: true + 服務器響應 Access-Control-Allow-Credentials: true

總結

關鍵概念說明
同源策略瀏覽器安全機制,限制跨源腳本交互。
跨域觸發條件協議、域名、端口任一不同即構成跨域。
解決方案CORS(推薦)、代理服務器、JSONP(過時)、WebSocket、同源化部署。
核心目標平衡功能與安全,防止惡意網站竊取數據或偽造請求。

理解跨域機制是前后端協同開發的基礎,正確配置 CORS 可兼顧安全性與靈活性。

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

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

相關文章

(46)elasticsearch-華為云CCE無狀態負載部署

一、準備好elasticsearch鏡像并提前上傳到鏡像倉庫 此次準備的是elasticsearch:v7.10.2 二、開始部署 負載名稱:es-deployment 注意:內部配額太低會造成多次重啟 環境變量: #單節點啟動(實例pod可以多增加幾個) discovery.type single-node 三、添加svc 四、注意:…

HCLP--MGER綜合實驗

一、拓撲圖二、需求1、R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有I地址; 2、R1和R5間使用PPP的PAP認證&#xff0c;R5為主認證方&#xff0c; R2與R5之間使用ppp的CHAP認證&#xff0c;R5為主認證方; R3與R5之間使用HDLc封裝; 3、R1、R2、R3構建一…

idea中無法刪除模塊,只能remove?

1.先對module右鍵想要刪除的module&#xff0c;選擇remove module&#xff08;這是idea為了避免誤操作&#xff09; 2.在remove module后&#xff0c;模塊并未從項目結構中刪除&#xff08;磁盤中也依舊存在&#xff09;&#xff0c;但再次右擊你會發現&#xff0c;出現了del…

青藤天睿RASP再次發威!捕獲E簽寶RCE 0day漏洞

在2025年HVV關鍵攻防節點上&#xff0c;攻擊隊對E簽寶電子合同服務發起的0day攻擊被青藤天睿RASP截獲。該漏洞可使攻擊者在未授權情況下實現服務器遠程代碼執行&#xff08;RCE&#xff09;&#xff0c;進而控制服務器&#xff0c;構成橫向滲透的關鍵跳板。>>>>漏洞…

Lua(字符串)

Lua字符串基礎Lua中的字符串是不可變序列&#xff0c;可以包含任意字節數據&#xff08;包括嵌入的\0&#xff09;。字符串可以用單引號、雙引號或長括號&#xff08;[[ ]]&#xff09;定義&#xff1a;str1 "Hello" str2 World str3 [[Multi-line string]]字符串…

大模型蒸餾(distillation)---從DeepseekR1-1.5B到Qwen-2.5-1.5B蒸餾

目錄 1.1 蒸餾目標 2 環境準備 2.1依賴庫安裝 2.2 硬件要求 2.3 模型與數據集下載 2.3.1 教師模型下載 2.3.2 學生模型下載 2.3.3 數據集準備或下載 3.過程日志 4. 模型加載與配置 4.1 加載教師模型 4.2 加載學生模型 4.3 數據預處理函數 4.4 數據收集器 4.5 定義…

通過redis_exporter監控redis cluster

環境說明&#xff1a; 現在有一套redis cluster&#xff0c;部署是3主機6實例架構部署。需要采集對應的指標&#xff0c;滿足異常監控告警&#xff0c;性能分析所需。 環境準備 以下環境需要提前部署完成。 redis cluser prometheus alertmanager grafna redis_exporter部署 我…

第二十天(正則表達式與功能實際運用)

在程序員一生的工作中&#xff0c;遇到的最多的數據就是字符串字符串里面很有可能有很多的不需要的信息我們需要從中間挑選出我們需要的如果循環去寫&#xff0c;比較簡單的時候問題不大規則多了&#xff0c;你的工作量會成倍上升的為了解決這個問題 ---- 正則表達式正則表達式…

0基礎法考隨手筆記 03(刑訴05 刑事證據與證明+06 強制措施)

1.如何區分書證和電子數據 書面材料是否為書證&#xff1f;→ 看內容是否直接源于案件事實&#xff08;不是 “記錄別人陳述” 的載體&#xff09;。 證據清單是否為證據&#xff1f;→ 看誰做的清單&#xff08;偵查人員做的勘查筆錄是證據&#xff0c;當事人做的目錄不是&…

資產負債表及其數據獲取

文章目錄資產負債表及其數據獲取資產負債表資產負債表在股票投資中的意義AKShare中的資產負債表數據接口&#xff08;深滬為例&#xff09;接口描述調用示例總結資產負債表及其數據獲取 資產負債表 資產負債表&#xff08;Balance Sheet&#xff09;是反映企業在某一特定日期財…

數據倉庫深度探索系列 | 開篇:開啟數倉建設新征程

數據倉庫深度探索系列 | 開篇&#xff1a;開啟數倉建設新征程 在當今信息技術飛速發展的背景下&#xff0c;企業面臨著數據量的爆炸式增長。企業不僅要高效管理海量數據&#xff0c;還需從中提取關鍵信息以支持復雜決策。數據倉庫已從單純的數據存儲工具&#xff0c;演變為支持…

Linux如何執行系統調用及高效執行系統調用:深入淺出的解析

文章目錄如何執行系統調用及高效執行系統調用&#xff1a;深入淺出的解析一、什么是系統調用&#xff1f;1.1 系統調用的作用1.2 系統調用的分類二、如何執行系統調用&#xff1f;2.1 系統調用的觸發2.2 庫函數與系統調用的關系2.3 系統調用的示例2.4 錯誤處理三、如何高效執行…

基于 XGBoost 與 SHAP 的醫療自動化辦公與可視化系統(上)

摘要 隨著信息技術的飛速發展和醫療健康數據的爆炸式增長,現代醫療機構面臨著日益復雜的數據處理挑戰。醫生和行政人員常常需要花費大量時間在數據提取、整理、分析和報告生成等重復性、事務性的工作上,這不僅降低了工作效率,也限制了醫護人員將更多精力投入到直接的患者護…

基于Kafka實現簡單的延時隊列

生命無罪&#xff0c;健康萬歲&#xff0c;我是laity。 我曾七次鄙視自己的靈魂&#xff1a; 第一次&#xff0c;當它本可進取時&#xff0c;卻故作謙卑&#xff1b; 第二次&#xff0c;當它在空虛時&#xff0c;用愛欲來填充&#xff1b; 第三次&#xff0c;在困難和容易之間&…

OceanBase 4.3.5 解析:DDL性能診斷

背景DDL操作通常耗時較長&#xff0c;特別是涉及補數據流程的DDL語句。在執行過程中&#xff0c;用戶面臨兩個主要痛點&#xff1a;一是無法實時獲取DDL執行進度&#xff0c;難以區分長時間運行是正常現象還是由內部異常導致的停滯&#xff1b;二是執行效率經常低于預期&#x…

幸福網咖訂座點餐小程序的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBoot微信小程序持久層框架MyBaits成功系統案例&#xff1a;參考代碼數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續…

C語言————練習題冊(答案版)

目錄 每日更新5-10題&#xff0c;感興趣可以訂閱 一.理解函數、操作符、占位符 1.1 歡迎來到C語言的世界 1.2 輸入和輸出 1.3 浮點數的打印 1.4 字符串的打印 1.14 I am iron man 1.5 求和運算 1.6 計算比例 1.7 求商求余 1.8 不同數位上的數字 1.8.1 求個位數 1.8…

haproxy配置詳解

1、haproxy簡介 HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年使用C語言開發的一個開源軟件 是一款具備高并發(萬級以上)、高性能的TCP和HTTP負載均衡器 支持基于cookie的持久性&#xff0c;自動故障切換&#xff0c;支持正則表達式及web狀態統計 企業版網站&#xff…

計網-TCP可靠傳輸

TCP&#xff08;傳輸控制協議&#xff09;的可靠傳輸是通過一系列機制保證數據準確、有序、不丟失地到達接收方。以下是TCP可靠傳輸的詳細過程及核心機制&#xff1a;1. 數據分塊與序列號&#xff08;Seq&#xff09;分塊&#xff1a;應用層數據被分割成適合傳輸的TCP報文段&am…

數智管理學(三十九)

第三章 數智化對管理理論的沖擊第三節 系統理論與生態化管理的強化系統理論作為理解企業運作與環境互動的重要框架&#xff0c;一直強調企業是一個由多個相互關聯子系統構成的整體&#xff0c;其核心要素包括整體性、開放性、動態性和反饋機制。在傳統管理視角下&#xff0c;這…