前端、node跨域問題

前端頁面訪問node后端接口跨域報錯

Access to XMLHttpRequest at 'http://192.18.31.75/api/get?name=ss&age=19' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

這個報錯的意思是:你的前端頁面(http://127.0.0.1:5500)在請求后端接口(http://192.18.31.75/api/get)時,因為跨域被瀏覽器攔截了。

原因:

  • ?

    瀏覽器的同源策略限制了不同源(協議、域名、端口不同)的請求。

  • ?

    后端沒有設置?Access-Control-Allow-Origin?響應頭,瀏覽器就會阻止前端訪問數據。


解決方法

1. 在 Express 后端允許跨域

安裝?cors?中間件:

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

npm?install?cors

在你的?app.js?里添加如下代碼:

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

const?cors?=?require("cors");
app.use(cors());//需要寫在路由注冊之前//有其他配置的寫法
app.use(cors({allowedHeaders: ["Content-Type", "Authorization", "token"]
}));

這樣所有接口都允許跨域訪問。


2. 手動設置響應頭(不推薦,推薦用 cors)

2.1 cors響應 Access-Control-Allow-Origin

手動設置響應頭:

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

app.use((req, res, next) => {res.setHeader("Access-Control-Allow-Origin", "*");//*也可寫成其他具體網站next();
});

使用 cors 中間件(推薦):

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

const cors = require("cors");
app.use(cors()); // 默認允許所有來源,自動設置 Access-Control-Allow-Origin: *
//或者
const cors = require("cors");
app.use(cors({origin: "http://127.0.0.1:5500" // 只允許這個來源跨域
}));

2.2 cors響應頭,Access-Control-Allow-Headers

是 CORS(跨域資源共享)中的一個響應頭,用于指定允許哪些自定義請求頭可以在跨域請求中使用。

cors僅支持客戶端向服務器發送9個請求頭,如果客戶向服務器發送了額外的請求頭信息,則需要在服務端,通過Access-Control-Allow-Headers對額外的請求頭聲明

手動設置響應頭:

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

//允許客戶端額外向服務器發送Content-Type請求頭和X-Custom-Header請求頭
res.setHeader('Access-Control-Allow-Headers','Content-Type','X-Custom-Header')
res.setHeader("Access-Control-Allow-Origin", "*");

使用 cors 中間件(推薦):

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

const cors = require("cors");
app.use(cors({allowedHeaders: ["Content-Type", "Authorization", "token"]
}));

2.3 cors響應頭,Access-Control-Allow-Methods

Access-Control-Allow-Methods?是 CORS(跨域資源共享)中的一個響應頭,用于指定允許哪些 HTTP 方法可以進行跨域請求

作用:

當瀏覽器發起跨域請求時,如果請求方法不是簡單的 GET/POST/HEAD,或者有自定義頭部,會先發送一個預檢請求(OPTIONS)。服務器需要通過?Access-Control-Allow-Methods?告訴瀏覽器:哪些方法(如 GET、POST、PUT、DELETE 等)是被允許的。

常見用法:

手動設置響應頭:

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

app.use((req, res, next) => {res.setHeader("Access-Control-Allow-Origin", "*");res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");next();
});

使用 cors 中間件(推薦):

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

const cors = require("cors");
app.use(cors({methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
}));

3.jsonp

JSONP 用于解決跨域問題。 callback 是前端指定的回調函數名,后端用它把數據“包裹”起來返回,前端通過這個函數獲取數據。

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

//前端寫法
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><!-- 引入jquery線上版 --><script src="https://cdn.staticfile.net/jquery/3.7.1/jquery.min.js"></script></head><body><button id="btnjsonp">測試jsonp</button><script>$(function () {//jQuery 會自動生成類似 jQuery371013504642194028282_1754319071541 的回調名,并帶到請求里。$("#btnjsonp").on("click", function () {$.ajax({type: "GET",url: "http://192.18.31.75:80/api/jsonp",dataType: "jsonp",success: function (res) {console.log(res, "res");},});});});</script></body>
</html>

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

//node后端router.js文件
const express = require("express");
const apiRouter = express.Router();
//jsonp
// JSONP 用于解決跨域問題。
// callback 是前端指定的回調函數名,后端用它把數據“包裹”起來返回,前端通過這個函數獲取數據。
apiRouter.get("/jsonp", (req, res) => {// 這是因為你用 jQuery 的 $.ajax 或 $.getJSON 發起了 JSONP 請求,jQuery 會自動生成一個全局唯一的回調函數名(防止沖突),并把它作為 callback 參數傳給后端。// 后端收到請求后,把數據包裹在這個函數名里返回,前端就能通過這個函數拿到數據const funcName = req.query.callback;console.log("funcName", funcName); //打印結果:funcName jQuery371013504642194028282_1754319071541const data = { name: "zz", age: 11 };const scriptStr = `${funcName}(${JSON.stringify(data)})`;res.send(scriptStr);
});
module.exports = apiRouter;//app.js文件內容
const express = require("express");
const router = require("./router");
const cors = require("cors");//cors可以不用寫
const app = express();app.use(cors());//cors可以不用寫
app.use(express.urlencoded({ extended: false }));
app.use("/api", router);app.listen(80, () => {console.log("express server running at http://192.18.31.75");
});

總結:
只要后端加上 CORS 相關響應頭,前端就能正常跨域訪問接口了。推薦使用?cors?中間件,簡單安全。

備注:注意:主要在服務器端進行配置,客戶端無需做任何配置。cors在瀏覽器中有兼容性,只有支持XMLHttpRequest Level2的瀏覽器,才能正常的訪問開了cors的服務端接口(例如:IE10+ Chrom4+ FireFox3.5+)

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

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

相關文章

超越馬力歐:如何為經典2D平臺游戲注入全新靈魂

在游戲開發的世界里&#xff0c;2D平臺游戲仿佛是一位熟悉的老朋友。從《超級馬力歐兄弟》開啟的黃金時代到現在&#xff0c;這個類型已經經歷了數十年的演變與打磨。當每個基礎設計似乎都已被探索殆盡時&#xff0c;我們如何才能打造出一款令人耳目一新的平臺游戲&#xff1f;…

基于Springboot + vue3實現的時尚美妝電商網站

項目描述本系統包含管理員和用戶兩個角色。管理員角色&#xff1a;商品分類管理&#xff1a;新增、查看、修改、刪除商品分類。商品信息管理&#xff1a;新增、查看、修改、刪除、查看評論商品信息。用戶管理&#xff1a;新增、查看、修改、刪除用戶。管理員管理&#xff1a;查…

網絡協議之https?

寫在前面 https協議還是挺復雜的&#xff0c;本人也是經過了很多次的學習&#xff0c;依然感覺一知半解&#xff0c;無法將所有的知識點串起來&#xff0c;本次學習呢&#xff0c;也是有很多的疑惑點&#xff0c;但是還是盡量的輸出內容&#xff0c;來幫助自己和在看文章的你來…

word運行時錯誤‘53’,文件未找到:MathPage.WLL,更改加載項路徑完美解決

最簡單的方法解決&#xff01;&#xff01;&#xff01;安裝Mathtype之后粘貼顯示&#xff1a;運行時錯誤‘53’&#xff0c;文件未找到&#xff1a;MathPage.WLLwin11安裝mathtype后會有這個錯誤&#xff0c;這是由于word中加載項加載mathtype路徑出錯導致的&#xff0c;這時候…

React實現列表拖拽排序

本文主要介紹一下React實現列表拖拽排序方法&#xff0c;具體樣式如下圖首先&#xff0c;簡單展示一下組件的數據結構 const CodeSetting props > {const {$t, // 國際化翻譯函數vm, // 視圖模型數據vm: {CodeSet: { Enable [], …

將 MySQL 表數據導出為 CSV 文件

目錄 一、實現思路 二、核心代碼 1. 數據庫連接部分 2. 數據導出核心邏輯 3. CSV文件寫入 三、完整代碼實現 五、輸出結果 一、實現思路 建立數據庫連接 查詢目標表的數據總量和具體數據 獲取表的列名作為CSV文件的表頭 將查詢結果轉換為二維數組格式 使用Hutool工具…

一文讀懂RAG:從生活場景到核心邏輯,AI“查資料答題”原來這么簡單

一文讀懂RAG&#xff1a;從生活場景到核心邏輯&#xff0c;AI“查資料答題”原來這么簡單 要理解 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09;&#xff0c;不需要先背復雜公式&#xff0c;我們可以從一個生活場景切入——它本質是讓AI…

git將當前分支推送到遠端指定分支

在 Git 中&#xff0c;將當前本地分支推送到遠程倉庫的指定分支&#xff0c;可以使用 git push 命令&#xff0c;并指定本地分支和遠程分支的映射關系。 基本語法 git push <遠程名稱> <本地分支名>:<遠程分支名><遠程名稱>&#xff1a;通常是 origin&…

【Linux】線程封裝

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、為什么需要封裝線程庫&#xff1f; pthread的痛點&#xff1a; 封裝帶來的好處&#xff1a; 二、線程封裝核心代碼解析 1. 頭文件定義&#xff08;Thread.hpp&a…

智慧交通管理信號燈通信4G工業路由器應用

在交通信號燈管理中傳統的有線通訊&#xff08;光纖、網線&#xff09;存在部署成本高、偏遠區域覆蓋難、故障維修慢等問題&#xff0c;而4G工業路由器憑借無線化、高穩定、強適配的特性&#xff0c;成為信號燈與管控平臺間的數據傳輸核心&#xff0c;適配多場景需求。智慧交通…

《Python Flask 實戰:構建一個可交互的 Web 應用,從用戶輸入到智能響應》

《Python Flask 實戰:構建一個可交互的 Web 應用,從用戶輸入到智能響應》 一、引言:從“Hello, World!”到“你好,用戶” 在 Web 應用的世界里,最打動人心的功能往往不是炫酷的界面,而是人與系統之間的真實互動。一個簡單的輸入框,一句個性化的回應,往往能讓用戶感受…

開發效率翻倍:資深DBA都在用的MySQL客戶端利器

MySQL 連接工具&#xff08;也稱為客戶端或圖形化界面工具&#xff0c;GUI Tools&#xff09;是數據庫開發、管理和運維中不可或缺的利器。它們比命令行更直觀&#xff0c;能極大提高工作效率。以下是一份主流的 MySQL 連接工具清單&#xff0c;并附上了它們的優缺點和適用場景…

基于Docker和Kubernetes的CI/CD流水線架構設計與優化實踐

基于Docker和Kubernetes的CI/CD流水線架構設計與優化實踐 本文分享了在生產環境中基于Docker和Kubernetes構建高效可靠的CI/CD流水線的實戰經驗&#xff0c;包括業務場景、技術選型、詳細方案、踩坑與解決方案&#xff0c;以及最終的總結與最佳實踐&#xff0c;幫助后端開發者快…

Trae x 圖片素描MCP一鍵將普通圖片轉換為多風格素描效果

目錄前言一、核心工具與優勢解析二、操作步驟&#xff1a;從安裝到生成素描效果第一步&#xff1a;獲取MCP配置代碼第二步&#xff1a;下載第三步&#xff1a;在 Trae 中導入 MCP 配置并建立連接第四步&#xff1a;核心功能調用三、三大素描風格差異化應用四.總結前言 在設計創…

2 XSS

XSS的原理 XSS&#xff08;跨站腳本攻擊&#xff09;原理 1. 核心機制 XSS攻擊的本質是惡意腳本在用戶瀏覽器中執行。攻擊者通過向網頁注入惡意代碼&#xff0c;當其他用戶訪問該頁面時&#xff0c;瀏覽器會執行這些代碼&#xff08;沒有對用戶的輸入進行過濾導致用戶輸入的…

GitHub每日最火火火項目(9.3)

1. pedroslopez / whatsapp-web.js 項目名稱&#xff1a;whatsapp-web.js項目介紹&#xff1a;基于 JavaScript 開發&#xff0c;是一個用于 Node.js 的 WhatsApp 客戶端庫&#xff0c;通過 WhatsApp Web 瀏覽器應用進行連接&#xff08;A WhatsApp client library for NodeJS …

Ansible變量

Ansible變量定義變量規則&#xff1a;由字母/數字/下劃線組成&#xff0c;變量需要以字母開頭&#xff0c;ansible內置的關鍵字不能作為變量。ansible中&#xff0c;可以將變量簡化為三個范圍&#xff1a;Global范圍&#xff08;高&#xff09;&#xff1a;從命令行和ansible配…

Elasticsearch 核心特性與應用指南

最近在準備面試&#xff0c;正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解&#xff0c;以及高頻業務場景的應對策略系統梳理一遍&#xff0c;既能加深記憶&#xff0c;也能讓知識體系更扎實&#xff0c;供大家參考&#xff0c;歡迎討論。一、核心優勢 Ela…

力扣115:不同的子序列

力扣115:不同的子序列題目思路代碼題目 給你兩個字符串 s 和 t &#xff0c;統計并返回在 s 的 子序列 中 t 出現的個數。 測試用例保證結果在 32 位有符號整數范圍內。 思路 首先我們來考慮特殊情況&#xff0c;當s串的長度小于t串時s串肯定就沒有t串了。其他情況我們就需…

2004-2023年各省生活垃圾無害化處理率數據(無缺失)

2004-2023年各省生活垃圾無害化處理率數據&#xff08;無缺失&#xff09; 1、時間&#xff1a;2004-2023年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;生活垃圾無害化處理率 4、范圍&#xff1a;30省 5、指標解釋&#xff1a;生活垃圾無害化處理率指報…