常見的瀏覽器跨域解決方法

1. 前端方法:JSONP(僅適用于GET請求)

JSONP(JSON with Padding)是一種利用<script>標簽的src屬性不受同源策略限制的特性來實現跨域數據請求的方法。JSONP通過在前端動態創建<script>標簽,并將請求的URL設置為需要跨域訪問的API地址,來獲取跨域數據。

前端代碼示例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JSONP Example</title>
</head>
<body><script>function handleResponse(data) {console.log(data); // 處理返回的JSON數據}// 動態創建script標簽var script = document.createElement('script');script.src = 'http://example.com/api?callback=handleResponse';document.body.appendChild(script);
</script></body>
</html>

后端代碼示例(Node.js使用Express)

const express = require('express');
const app = express();
const port = 3000;app.get('/api', (req, res) => {const callback = req.query.callback; // 獲取前端傳遞的回調函數名const data = { message: 'Hello, JSONP!' }; // 要返回的數據// 構建JSONP格式的響應res.send(`${callback}(${JSON.stringify(data)})`);
});app.listen(port, () => {console.log(`Server is running on port ${port}`);
});

2. 后端方法:CORS(跨來源資源共享)

CORS是一種W3C規范,它允許瀏覽器向跨源服務器發出XMLHttpRequest請求。要實現CORS,后端服務器需要在響應頭中設置相應的CORS頭部。

前端代碼示例

// 使用Fetch API發送請求
fetch('http://example.com/api', {method: 'GET',mode: 'cors', // 表明這是一個跨域請求headers: {'Content-Type': 'application/json'}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

后端代碼示例(Node.js使用Express)

const express = require('express');
const app = express();
const port = 3000;// 使用CORS中間件
const cors = require('cors');
app.use(cors()); // 允許所有來源的跨域請求app.get('/api', (req, res) => {const data = { message: 'Hello, CORS!' };res.json(data);
});app.listen(port, () => {console.log(`Server is running on port ${port}`);
});

在上面的后端示例中,我們使用了cors中間件來簡化CORS頭部的設置。這個中間件可以配置來允許特定來源的請求,或者使用通配符*來允許所有來源的請求。

3. 前端配置代理(Proxy)

在Web開發中,使用webpack的devServer配置代理是一種常見的方法來解決跨域問題,特別是在開發環境中。webpack-dev-server提供了一個proxy選項,允許你指定一些規則來將特定的請求代理到另一個服務器。
以下是如何在webpack的devServer配置中使用proxy來解決跨域問題的示例:

首先,確保你已經安裝了webpack和webpack-dev-server。如果沒有,你可以通過npm或yarn來安裝它們:

npm install --save-dev webpack webpack-dev-server
# 或者
yarn add --dev webpack webpack-dev-server

然后,在你的webpack配置文件(通常是webpack.config.jswebpack.dev.js)中,添加devServer字段,并在其中配置proxy選項:

const path = require('path');module.exports = {// ...其他webpack配置...devServer: {contentBase: path.join(__dirname, 'dist'), // 靜態文件目錄compress: true, // 開啟gzip壓縮port: 9000, // 端口號proxy: {// 選項寫法'/api': {target: 'http://example.com', // 目標地址ws: true, // 是否啟用websocketschangeOrigin: true, // 開啟代理,在本地創建一個虛擬服務器,然后發送請求的數據,會同時會收到請求的數據,這樣服務端和服務端進行數據的交互就不會有跨域問題pathRewrite: {'^/api': '' // 路徑重寫,移除路徑中的/api},router: {// 當請求不匹配任何代理規則時,請求會到達這個路由'/': 'http://example.com'}},// 簡寫選項'/foo': 'http://example.com'}}
};

在上面的配置中,所有以/api開頭的請求都會被代理到http://example.comchangeOrigin選項設置為true,這樣代理就會改變請求頭中的Origin,確保它與目標服務器的Origin一致,從而避免CORS問題。pathRewrite選項用于重寫請求路徑,移除/api前綴。

現在,當你運行webpack-dev-server時(通常是通過npx webpack servenpm run serve等命令),任何發送到/api的請求都會被代理到http://example.com,而瀏覽器不會遇到跨域問題。

請確保將target的值替換為你想要代理的實際API服務器的地址。此外,根據你的需要,你可能還需要調整其他代理選項,如ws(用于WebSockets)、pathRewriterouter等。

4. 代理服務器

代理服務器是一個位于客戶端和目標服務器之間的中間服務器。客戶端的請求首先發送到代理服務器,然后由代理服務器轉發到目標服務器。代理服務器可以在不同的域中運行,因此它可以繞過瀏覽器的同源策略限制。前端向代理服務器發送請求,代理服務器再向目標服務器發送請求,并將結果返回給前端。這種方法不需要修改前端或目標服務器的代碼。

5. WebSockets

WebSocket是一種網絡通信協議,它允許在用戶的瀏覽器和服務器之間建立一條持久的連接。與HTTP不同,WebSocket連接不受同源策略的限制,因此可以用來解決跨域問題。然而,需要注意的是,并非所有服務器都支持WebSocket,并且它可能不適用于所有類型的跨域通信。

6. 反向代理

反向代理服務器通常部署在網站的前端,用于接收客戶端的請求,然后將這些請求轉發給后端服務器。由于反向代理服務器與客戶端處于同一域下,它可以繞過同源策略限制,將跨域請求轉發給后端服務器。這種方法需要配置服務器端的反向代理軟件,如Nginx或HAProxy。

7. 瀏覽器插件或擴展

一些瀏覽器插件或擴展可以修改瀏覽器的行為,以允許跨域請求。然而,這種方法并不推薦在生產環境中使用,因為它依賴于用戶的瀏覽器設置和安裝的插件,不可控因素較多。

8. 修改瀏覽器設置

在某些情況下,可以通過修改瀏覽器的設置來允許跨域請求。例如,在Chrome瀏覽器中,可以啟動開發者模式并禁用同源策略。然而,這種方法僅適用于開發和測試環境,不建議在生產環境中使用。

9. 使用CDN

通過內容分發網絡(CDN)來解決跨域問題。CDN可以將資源緩存在不同的域名下,前端可以通過CDN的地址來加載資源,從而繞過同源策略限制。

注意事項

  • JSONP只能用于GET請求,因為它基于<script>標簽的src屬性。
  • CORS是一種更現代、更靈活的方法,支持所有類型的HTTP請求。
  • 前后端需要協作來解決跨域問題,前端負責發起請求,后端負責配置CORS頭部來允許跨域請求。
  • 在生產環境中,后端應該仔細配置CORS策略,只允許可信的源進行跨域請求,以增強系統的安全性。

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

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

相關文章

4.1.CVAT——目標檢測的標注詳細步驟

文章目錄 1. 進入任務1. 創建任務2. 已創建的task3. 進入標注界面 2. 選擇標注類型2.1 選擇標注類型2.2 進行標注2.3 遮擋 2.快捷鍵3.導出標注結果 1. 進入任務 登錄后會看到如下圖界面&#xff0c;CVAT的標注最小單位是Task&#xff0c;每個Task為一個標注任務。點擊Task按鈕…

[法規規劃]國家數據局局長劉烈宏《激活數據要素價值》演講要點解析

國家數據局黨組書記、局長劉烈宏在北大光華論壇上發表了題為《激活數據要素價值》的演講&#xff0c;當時曾極大推動了市場熱度&#xff0c;引發了行業思考。現在演講過去了一段時間&#xff0c;但是溫故而知新&#xff0c;我們不妨結合演講之后的市場反應&#xff0c;回顧一下…

蚓鏈數字化快速轉型五步

數字化轉型對于許多企業來說是一個頭痛的問題&#xff0c;因為他們可能感到缺乏明確的方向和方法。不過&#xff0c;蚓鏈數字化生態系統提出了一套快速轉型五步法&#xff0c;旨在幫助企業明確目標、建立團隊、設計權益、提供思維和方法&#xff0c;并共享生態資源&#xff0c;…

【java任意文件漏洞修復,使用文件魔數解決】

java任意文件漏洞修復&#xff0c;使用文件魔數解決 背景&#xff1a; 客戶進行滲透測試&#xff0c;驗證上傳文件的程序沒有對上傳文件作任何過濾&#xff0c;導致可以上傳任意文件到服務器&#xff0c;甚至是病毒文件和Webshell木馬文件。 解決辦法&#xff1a;對于上傳的附件…

html基本標簽

<h1></h1> <p></p> h是標簽從h1~h6&#xff0c;沒用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平臺</a> href可以指定鏈接進行跳轉 <img src"https://www.educoder.net/attachments/download/2078…

【論文精讀】DALLE: Zero-Shot Text-to-Image Generation零樣本文本到圖像生成

文章目錄 一、前言二、摘要三、方法&#xff08;一&#xff09;主要目標&#xff08;二&#xff09;stage 1&#xff1a;訓練離散變分自動編碼器&#xff08;dVAE&#xff09;&#xff08;三&#xff09;stage 2&#xff1a;訓練自回歸轉換器&#xff08;四&#xff09;公式表達…

「優選算法刷題」:最后一塊石頭的重量

一、題目 有一堆石頭&#xff0c;每塊石頭的重量都是正整數。 每一回合&#xff0c;從中選出兩塊 最重的 石頭&#xff0c;然后將它們一起粉碎。假設石頭的重量分別為 x 和 y&#xff0c;且 x < y。那么粉碎的可能結果如下&#xff1a; 如果 x y&#xff0c;那么兩塊石頭…

Flutter開發之CupertinoApp

Flutter開發之CupertinoApp 最近由于使用Flutter編程更多&#xff0c;使用Flutter更順手&#xff0c;相對于其他前端框架來說&#xff0c;Flutter在跨平臺、響應式UI、自繪引擎、即插即用的組件和龐大的社區生態支持方面有更大的優勢&#xff1b;Flutter擁有更低的學習成本&am…

2024牛客寒假算法基礎集訓營5 H sakiko的排列構造(hard)個人補題o(╥﹏╥)o

sakiko要構造一個長度為 nnn 的排列 ppp &#xff0c;使得每一個 pii (1≤i≤n)p_ii\ (1\leq i\leq n)pi?i (1≤i≤n) 都是質數。 排列的定義為&#xff1a;長度為 nnn 的數組&#xff0c;其中 1?n1-n1?n 每個數字在數組中各出現一次。 輸入描述: 第一行輸入一個整數 n(1…

gpt批量工具,gpt批量生成文章工具

GPT批量工具在今天的數字化時代扮演著越來越重要的角色&#xff0c;它們通過人工智能技術&#xff0c;可以自動批量生成各種類型的文章&#xff0c;為用戶提供了便利和效率。本文將介紹5款不同的GPT批量工具&#xff0c;并介紹一款知名的147GPT生成工具&#xff0c;以及另外一款…

c++/c圖的鄰近矩陣表示

#include<iostream> using namespace std;#define MaxVerterNum 100 typedef char VerterType; typedef int EdgeType; typedef struct {VerterType vexs[MaxVerterNum]; // 存儲頂點EdgeType edges[MaxVerterNum][MaxVerterNum]; // 存儲鄰接矩陣int n, e; // 頂點數和邊…

JVM堆內存中新生代晉升到老年代的條件

1. 一般年齡判斷 當對象在Eden區中經過第一次 Minor GC 后&#xff0c;如果仍然存活&#xff0c;則會被移動到 From Survivor 區&#xff0c;并且對象的年齡設為 1。每經過一次 Minor GC&#xff0c;存活下來的對象年齡加 1&#xff0c;若存活對象在 From Survivor 區的年齡達…

netlink原理及應用

什么是netlink netlink是一種基于網絡的通信機制&#xff0c;允許內核內部、內核與用戶態應用之間甚至用戶態應用之間進行通信&#xff1b;netlink的主要作用是內核與用戶態之間通信&#xff1b;它的思想是&#xff0c;基于BSD的socket使用網絡框架在內核和用戶態之間進行通信…

GaussDB跨云容災:實現跨地域的數據庫高可用能力

背景 金融、銀行業等對數據的安全有著較高的要求&#xff0c;同城容災建設方案&#xff0c;在絕大多數場景下可以保證業務數據的安全性&#xff0c;但是在極端情況下&#xff0c;如遇不可抗力因素等&#xff0c;要保證數據的安全性&#xff0c;就需要采取跨地域的容災方案。 …

Dell R730 2U服務器實踐3:安裝英偉達上代專業AI訓練Nvidia P4計算卡

Dell R730是一款非常流行的服務器&#xff0c;2U的機箱可以放入兩張顯卡&#xff0c;這次先用一張英偉達上代專業級AI訓練卡&#xff1a;P4卡做實驗&#xff0c;本文記錄安裝過程。 簡潔步驟&#xff1a; 打開機箱將P4顯卡插在4號槽位關閉機箱安裝驅動 詳細步驟&#xff1a; 對…

2024目前三種有效加速國內Github

大家好我是咕嚕美樂蒂&#xff0c;很高興又和大家見面了&#xff01;截至2024年&#xff0c;國內訪問 GitHub 的速度受到多種因素的影響&#xff0c;包括網絡封鎖、地理距離、網絡帶寬等。為了提高國內用戶訪問 GitHub 的速度&#xff0c;以下是目前較為有效的三種加速方式&…

網絡工程師學習筆記——VRP配置命令大全

VRP是Versatile Routing Platform的簡稱&#xff0c;它是華為公司數據通信產品的通用網絡操作系統。它以IP業務為核心&#xff0c;采用組件化的體系結構&#xff0c;在實現豐富功能特性的同時&#xff0c;還提供了基于應用的可裁剪和可擴展的功能&#xff0c;使得路由器和交換機…

計算機網絡物理層知識點總結

本篇博客是基于謝希仁編寫的《計算機網絡》和王道考研視頻總結出來的知識點&#xff0c;本篇總結的主要知識點是第二章的物理層。上一章的傳送門&#xff1a;計算機網絡體系結構-CSDN博客 通信基礎 物理層概念 物理層解決如何在連接各種計算機的傳輸媒體上傳輸數據比特流&am…

【Kubernetes】k8s中容器之間、pod之間如何進行網絡通信?

目錄 PodKubernetes 網絡模型同一Pod上的容器之間進行通信同一Node上的不同Pod之間進行通信不同Node上的Pod之間進行通信Service參考 Pod 首先來回顧一下Pod&#xff1a; Pod 是用于構建應用程序的最小可部署對象。單個 Pod 代表集群中正在運行的工作負載&#xff0c;并封裝一…

C++初階篇----類與對象上卷

目錄 引言1.面向過程和面向對象初步認識2.類的引入3.類的定義3.1聲明與定義全部放在類體中3.2聲明與定義分離 4.類的訪問限定符及封裝4.1訪問限定符4.2封裝 5.類的作用域6.類的實例化類是對對象進行描述一個類&#xff08;一個類型變量&#xff09;可以實例化出多個對象 7.類對…