【CORS 報錯】跨域請求問題:CORS 多種環境下的解決方案

在這里插入圖片描述

🔥 個人主頁:空白詩

在這里插入圖片描述

文章目錄

    • 一、CORS錯誤的常見原因
    • 二、解決方案
      • 1. Vue3 + Vite項目下的解決方案
        • 創建Vue3 + Vite項目
        • 配置Vite的代理
        • 發送請求
      • 2. jQuery項目下的解決方案
        • 使用CORS請求頭
        • 使用JSONP
      • 3. 其他環境下的解決方案
        • 使用服務器端代理
            • 設置CORS頭
            • 使用Nginx配置代理
    • 三、總結

在這里插入圖片描述

跨域資源共享(CORS, Cross-Origin Resource Sharing)問題是前端開發中的常見挑戰。本文將詳細介紹在不同環境下(如Vue3 + Vite項目、jQuery項目以及其他環境下)的解決方案。


一、CORS錯誤的常見原因

跨域問題的本質是瀏覽器出于安全考慮,限制從一個源(域、協議、端口)加載資源到另一個源。這種安全機制被稱為“同源策略”。同源策略規定,只有當請求的URL與當前網頁的URL具有相同的協議、域名和端口時,瀏覽器才允許該請求通過。

  1. 缺乏CORS頭
    服務器沒有設置正確的CORS響應頭,導致瀏覽器拒絕請求。例如,瀏覽器期望服務器響應中包含 Access-Control-Allow-Origin 頭,如果沒有設置該頭,瀏覽器會阻止請求。

  2. 跨域請求被禁止
    默認情況下,瀏覽器會阻止跨域請求以保護用戶的安全。如果服務器沒有允許特定的域進行訪問,瀏覽器會拋出CORS錯誤。

  3. 預檢請求失敗
    對于一些復雜的請求,瀏覽器會發送一個預檢請求(OPTIONS請求)來確認服務器是否允許該請求。如果預檢請求失敗,則會導致CORS錯誤。


二、解決方案

1. Vue3 + Vite項目下的解決方案

通過Vite的開發服務器代理功能,可以將本地的請求代理到不同的服務器,從而避免跨域問題。以下是具體步驟:

創建Vue3 + Vite項目
npm create vite@latest
cd your-project-name
npm install

選擇Vue3模板,并進入項目目錄。

配置Vite的代理

在Vite項目的根目錄下找到vite.config.ts(或vite.config.js),并進行以下配置:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';export default defineConfig({plugins: [vue()],server: {proxy: {'/api': {target: 'http://api.example.com', // 目標服務器changeOrigin: true, // 是否改變請求源rewrite: (path) => path.replace(/^\/api/, ''), // 重寫路徑},},},
});
發送請求

在Vue組件中,可以通過axios或者fetch發送請求。例如:

<template><div><button @click="fetchData">獲取數據</button><div v-if="data">{{ data }}</div></div>
</template><script lang="ts">
import { defineComponent, ref } from 'vue';
import axios from 'axios';export default defineComponent({setup() {const data = ref(null);const fetchData = async () => {try {const response = await axios.get('/api/data');data.value = response.data;} catch (error) {console.error('請求錯誤:', error);}};return {data,fetchData,};},
});
</script>

2. jQuery項目下的解決方案

在jQuery項目中,可以通過設置請求頭或使用JSONP來解決CORS問題。

使用CORS請求頭

確保服務器設置了正確的CORS頭,如 Access-Control-Allow-Origin。在客戶端發起請求時:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>$.ajax({url: 'http://api.example.com/data',method: 'GET',success: function(data) {console.log(data);},error: function(xhr, status, error) {console.error('請求錯誤:', error);}});
</script>
使用JSONP

如果服務器支持JSONP,可以通過以下方式解決跨域問題:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>$.ajax({url: 'http://api.example.com/data',method: 'GET',dataType: 'jsonp', // 使用JSONPsuccess: function(data) {console.log(data);},error: function(xhr, status, error) {console.error('請求錯誤:', error);}});
</script>

3. 其他環境下的解決方案

使用服務器端代理

在許多情況下,可以在服務器端設置一個代理,將跨域請求通過服務器端轉發。例如,在Node.js中可以使用http-proxy-middleware

const { createProxyMiddleware } = require('http-proxy-middleware');app.use('/api', createProxyMiddleware({target: 'http://api.example.com',changeOrigin: true,pathRewrite: {'^/api': '',},
}));
設置CORS頭

確保服務器響應中包含正確的CORS頭。例如,在Node.js + Express中:

const express = require('express');
const app = express();app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', '*');res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');next();
});app.get('/data', (req, res) => {res.json({ message: 'Hello World' });
});app.listen(3000, () => {console.log('Server running on port 3000');
});
使用Nginx配置代理

在Nginx中,可以通過配置代理解決CORS問題:

server {listen 80;server_name yourdomain.com;location /api/ {proxy_pass http://api.example.com/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}

三、總結

CORS問題是前端開發中常見的一個挑戰,但通過合理的代理配置和服務器設置可以有效解決。在不同環境下,可以使用Vite的代理功能、設置請求頭、JSONP、服務器端代理、Nginx代理等多種方式來解決跨域問題。希望本文對你理解和解決CORS問題有所幫助。

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

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

相關文章

PS拉框選擇工具

Photoshop&#xff08;PS&#xff09;中的拉框選擇工具&#xff0c;也稱為選框工具&#xff0c;是圖像處理中非常基礎且強大的工具之一。它允許用戶通過繪制矩形、橢圓形以及單行、單列的選擇框來選定圖像中的特定區域。本教程將詳細介紹選框工具的使用方法、技巧及其屬性設置。…

嵌入式Qt開發C++核心編程知識萬字總結

C核心編程 文章目錄 C核心編程1、程序的內存模型2、函數高級1.函數的默認參數2.函數的占位參數3.函數重載1.基本語法2.注意事項 3、類和對象1.類1.類的組成2.類的訪問權限3.class和struct的區別 2.構造函數&#xff08;Constructor&#xff09;1.示例2.特點 3.析構函數&#xf…

前端vue3 登錄頁面 響應式開發

一個登錄頁面 我直接上代碼了 結構是這樣的 Login 頁面 <template><a-layout class"login-box"><a-layout-content class"login-content"><a-row align"middle" justify"center" class"login-content-ma…

蝙蝠避障:為盲人出行插上科技的翅膀

在這個五彩斑斕的世界里&#xff0c;每一步都充滿了探索與驚喜。但對于我這樣的視障者來說&#xff0c;每一次出行都是一場未知的冒險。我時常面臨著難以想象的挑戰&#xff1a;如何安全地穿越繁忙的街道&#xff0c;怎樣準確地識別前方的障礙物&#xff0c;乃至簡單地找到回家…

viewmodel創建及使用分析

1、相關的類 ViewModelStore &#xff1a;管理viewModel實例&#xff0c;內部包含一個Map用來存儲viewmodel&#xff0c;內部包括put、get、clear等方法ViewModelProvider &#xff1a;管理ViewModelStore和Factory&#xff0c;Factory里面有create方法是創建對應的viewmodel的…

Facebook的未來藍圖:從元宇宙到虛擬現實的跨越

隨著科技的不斷演進和社會的數字化轉型&#xff0c;虛擬現實&#xff08;VR&#xff09;和增強現實&#xff08;AR&#xff09;作為下一代計算平臺正逐漸走進人們的視野。作為全球領先的科技公司之一&#xff0c;Facebook正在積極探索并推動這一領域的發展&#xff0c;以實現其…

嫌云服務器太貴,使用內網穿透代替

企業與個人開發者常常面臨一個現實問題&#xff1a;高昂的云服務器成本。隨著業務需求的增長&#xff0c;持續的服務器租賃費用可能成為負擔。然而&#xff0c;在這個充滿創新的時代&#xff0c;一種名為“內網穿透”的技術正逐漸成為解決這一難題的優選方案。本文將探討內網穿…

深度學習基礎與實戰:Python實現

深度學習基礎與實戰&#xff1a;Python實現 深度學習是機器學習的一個重要分支&#xff0c;通過多層神經網絡實現對數據的自動特征提取和建模。本文將介紹深度學習的基礎概念、常用框架以及一個完整的實戰項目&#xff0c;幫助讀者從基礎入門到實際應用。 目錄 深度學習概述…

CF 1986D. Mathematical Problem

原題鏈接&#xff1a;Problem - 1986D - Codeforces 題意&#xff1a;一串長度最多為20的由數字組成的字符串&#xff0c;在這些數字中間可以添加字符串長度減去二數量的符號&#xff0c;加或者乘&#xff0c;例如1234&#xff0c;就可以添加加號或者乘號二個&#xff0c;變成…

vue中el-table前端導出excel數據表格

一、el-table為正常時&#xff0c;導出方法如下&#xff1a; 1.添加導出按鈕 <el-button class"greenLinearbg dc" size"small" click"webExportTotalExcel()" v-if"totalBillShow">導出</el-button>2.導出方法 // we…

Spring開發實踐(二)

EnableAsync 和 Async 注解的使用方法 EnableAsync 和 Async 是Spring框架中的兩個注解&#xff0c;用于啟用和使用異步方法執行。它們可以幫助你在Spring應用程序中實現異步編程&#xff0c;從而提高應用程序的性能和響應速度。 EnableAsync EnableAsync 注解用于啟用Sprin…

ARM Ubuntu 主機安裝指定版本Python

要在你的ARM Linux主機上安裝Python 3.12&#xff0c;你可以從源碼編譯安裝。以下是具體步驟&#xff1a; 步驟1&#xff1a;安裝依賴 首先&#xff0c;確保你有必要的編譯工具和依賴包&#xff1a; sudo apt-get update sudo apt-get install -y build-essential libssl-d…

【每日一練】python的類.對象.成員.行為.方法傳參綜合實例(保姆式教學)

運行結果: 本節課程內容&#xff1a;類的使用 1.掌握類的定義和使用方法 2.掌握類的成員的方法使用 3.掌握self關鍵字的作用 4.定義在類里的函數是類的一種行為&#xff0c;叫方法 5.帶傳參的行為使用方法 類基本分兩部分組成&#xff1a;1.屬性,2.方法 類的使用語法&#xf…

springCloud整合Dubbo案例

前言&#xff1a; 好久沒有使用dubbo了&#xff0c;溫習一下。 一、先搭建一個SpringCloud框架 整體框架如下圖 1. 先創建一個父工程&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4…

開發者必讀:獲取電商API的多種渠道

開發電商軟件往往需要對接電商API&#xff0c;電商API可以從哪些渠道獲取&#xff1f;下面給大家介紹兩種獲取渠道。 一、從電商平臺開放平臺獲取電商API 電商平臺的開放平臺是獲取電商API最直接的渠道&#xff0c;但是電商平臺較多&#xff0c;每一個電商平臺都需要單…

Vue3 引入騰訊地圖 包含標注簡易操作

1. 引入騰訊地圖API JavaScript API | 騰訊位置服務 (qq.com) 首先在官網注冊賬號 并正確獲取并配置key后 找到合適的引入方式 本文不涉及版本操作和附加庫 據體引入參數參考如下圖 具體以鏈接中官方參數為準標題 在項目根目錄 index.html 中 寫入如下代碼 <!-- 引入騰…

Socks5代理為什么比HTTP代理快?

在數字化日益深入的時代&#xff0c;網絡安全和隱私保護成為了公眾關注的焦點。為了應對網絡威脅&#xff0c;保護個人隱私和數據安全&#xff0c;代理技術應運而生。在眾多代理協議中&#xff0c;SOCKS5代理和HTTP代理是兩種較為常見的選擇。然而&#xff0c;為何SOCKS5代理在…

網頁設計零基礎入門:前端技術全攻略

在當今互聯網飛速發展的時代&#xff0c;前端網頁設計已經成為一個備受關注的領域。隨著其重要性的不斷提高&#xff0c;越來越多的專業人士和愛好者開始對前端設計感興趣&#xff0c;希望通過掌握這項技術開辟自己的職業道路。然而&#xff0c;對于新手設計師來說&#xff0c;…

ollama + lobechat 搭建自己的多模型助手

背景 人工智能已經推出了快2年了&#xff0c;各種模型和插件&#xff0c;有漸漸變成熟的趨勢&#xff0c;打造一個類似 hao123網站的人工智能模型入口&#xff0c;也變得有需求了。用戶會去比較多個ai給出的答案&#xff0c;作為程序員想擁有一臺自己的GPU服務器來為自己服務。…

如何在vue的項目中導入阿里巴巴圖標庫

阿里巴巴矢量圖標庫官網&#xff1a;iconfont-阿里巴巴矢量圖標庫 選擇你喜歡的圖標&#xff0c;添加入庫 點擊添加至項目&#xff0c;并新建文件夾&#xff0c;點擊確定 選擇font-class&#xff0c;點擊生成代碼 代碼生成后&#xff0c;在網站上打開 全選復制到style 點擊復制…