返利app的跨域問題解決方案:CORS與反向代理在前后端分離架構中的應用

返利app的跨域問題解決方案:CORS與反向代理在前后端分離架構中的應用

大家好,我是阿可,微賺淘客系統及省賺客APP創始人,是個冬天不穿秋褲,天冷也要風度的程序猿!

在返利APP的前后端分離架構中,跨域問題是開發初期最常遇到的技術卡點——前端(如Vue/React項目)部署在http://localhost:8080,后端API部署在https://api.juwatech.cn,瀏覽器的同源策略會攔截跨域請求,導致商品列表加載、返利計算等核心功能失效。本文結合返利APP的實際業務場景,詳解兩種主流跨域解決方案:CORS(跨域資源共享)與反向代理,并提供完整代碼實現(Java后端代碼基于cn.juwatech.*包名),覆蓋開發、測試、生產全環境需求。
返利app

一、跨域問題本質與返利APP的典型場景

同源策略要求瀏覽器僅允許請求“協議、域名、端口”三者完全一致的資源,返利APP的以下場景會觸發跨域:

  1. 開發環境:前端本地調試(http://localhost:8080)請求后端測試API(http://test-api.juwatech.cn
  2. 生產環境:H5頁面(https://h5.taoke-app.com)請求后端API(https://api.juwatech.cn
  3. 第三方集成:調用淘寶聯盟開放接口(https://api.tbk.taobao.com)時的跨域請求

跨域請求被攔截時,瀏覽器控制臺會出現類似報錯:Access to XMLHttpRequest at 'https://api.juwatech.cn/rebate/calculate' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.,需通過技術方案突破同源限制。

二、方案一:CORS(跨域資源共享)配置

CORS是后端通過HTTP響應頭告知瀏覽器“允許特定源的跨域請求”,是返利APP生產環境的首選方案,支持細粒度控制允許的請求方法、頭信息與Credentials(如Cookie)。

2.1 后端全局CORS配置(Spring Boot)

通過cn.juwatech.web.config.CorsConfig實現全局跨域允許,覆蓋所有API接口:

package cn.juwatech.web.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {// 1. 配置CORS核心參數CorsConfiguration config = new CorsConfiguration();// 允許的源(生產環境建議指定具體域名,避免*)config.addAllowedOriginPattern("https://h5.taoke-app.com"); // 生產環境H5域名config.addAllowedOriginPattern("http://localhost:8080"); // 開發環境本地地址config.addAllowedOriginPattern("http://test-h5.juwatech.cn"); // 測試環境H5域名// 允許的請求方法(GET/POST/PUT/DELETE等)config.addAllowedMethod("*");// 允許的請求頭(如Content-Type、Authorization)config.addAllowedHeader("*");// 允許攜帶Credentials(如Cookie、Token)config.setAllowCredentials(true);// 預檢請求(OPTIONS)的緩存時間(秒),減少重復預檢config.setMaxAge(3600L);// 2. 配置CORS生效的URL模式(所有API接口)UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/api/**", config); // 返利APP核心API路徑source.registerCorsConfiguration("/taobao/union/**", config); // 淘寶聯盟接口封裝路徑// 3. 返回CORS過濾器return new CorsFilter(source);}
}

2.2 針對特定接口的CORS微調(注解方式)

若部分接口需特殊跨域配置(如僅允許特定源訪問),可通過@CrossOrigin注解覆蓋全局配置:

package cn.juwatech.rebate.controller;import cn.juwatech.rebate.dto.RebateCalculateDTO;
import cn.juwatech.rebate.service.RebateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/rebate")
public class RebateController {@Autowiredprivate RebateService rebateService;// 僅允許生產環境H5訪問該接口(覆蓋全局配置)@CrossOrigin(origins = "https://h5.taoke-app.com", allowCredentials = true)@PostMapping("/calculate")public Object calculateRebate(@RequestBody RebateCalculateDTO dto) {return rebateService.calculate(dto);}// 其他接口使用全局CORS配置@PostMapping("/history")public Object getRebateHistory(@RequestBody RebateHistoryQueryDTO dto) {return rebateService.getHistory(dto);}
}

2.3 前端配合配置(攜帶Credentials)

當后端開啟allowCredentials: true時,前端請求需設置withCredentials: true,避免Cookie/Token丟失(以Axios為例):

// 前端Axios全局配置(main.js)
import axios from 'axios';axios.defaults.baseURL = process.env.VUE_APP_API_BASE_URL; // 環境變量區分API地址
axios.defaults.withCredentials = true; // 允許攜帶Credentials
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8';// 請求攔截器(添加Token)
axios.interceptors.request.use(config => {const token = localStorage.getItem('taoke_token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;
});

三、方案二:反向代理(開發/測試環境首選)

反向代理通過“中間服務器轉發請求”,使前端請求看似同源(如http://localhost:8080/api轉發到https://api.juwatech.cn/api),避免瀏覽器同源策略攔截,適合開發環境快速調試(無需后端額外配置)。

3.1 開發環境:Vue CLI反向代理配置

在返利APP前端Vue項目的vue.config.js中配置代理,轉發API請求:

// vue.config.js
module.exports = {devServer: {port: 8080, // 前端本地端口open: true, // 啟動后自動打開瀏覽器proxy: {// 匹配以/api開頭的請求,轉發到后端API'/api': {target: 'http://test-api.juwatech.cn', // 測試環境后端地址changeOrigin: true, // 開啟反向代理(關鍵:模擬同源請求)pathRewrite: {'^/api': '/api' // 路徑重寫(若后端接口前綴一致,無需修改)},// 配置HTTPS代理(若后端使用HTTPS)secure: false, // 開發環境忽略HTTPS證書驗證headers: {// 自定義請求頭(如模擬租戶ID)'X-Tenant-Id': 'tenant_1001'}},// 轉發淘寶聯盟接口請求'/taobao/union': {target: 'https://api.tbk.taobao.com', // 淘寶聯盟官方接口地址changeOrigin: true,pathRewrite: {'^/taobao/union': '' // 移除前綴(因淘寶接口無該前綴)}}}}
};

配置后,前端請求http://localhost:8080/api/rebate/calculate會自動轉發到http://test-api.juwatech.cn/api/rebate/calculate,瀏覽器無跨域報錯。

3.2 生產環境:Nginx反向代理配置

生產環境通過Nginx配置反向代理,同時實現負載均衡與跨域處理,適合高并發場景:

# /etc/nginx/conf.d/taoke-app.conf
server {listen 80;server_name h5.taoke-app.com; # 前端H5域名# 重定向HTTP到HTTPSreturn 301 https://$host$request_uri;
}server {listen 443 ssl;server_name h5.taoke-app.com;# SSL證書配置(生產環境需替換為真實證書)ssl_certificate /etc/nginx/ssl/taoke-app.crt;ssl_certificate_key /etc/nginx/ssl/taoke-app.key;# 前端靜態資源配置(H5頁面)location / {root /usr/share/nginx/html/taoke-h5; # 前端打包后文件路徑index index.html;try_files $uri $uri/ /index.html; # 解決SPA路由刷新404問題}# 反向代理API請求(解決跨域)location /api/ {proxy_pass https://api.juwatech.cn/api/; # 后端API地址proxy_set_header Host $host; # 傳遞Host頭proxy_set_header X-Real-IP $remote_addr; # 傳遞真實IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme; # 傳遞協議(HTTP/HTTPS)# 配置緩存(非核心接口)proxy_cache api_cache;proxy_cache_valid 200 304 5m; # 200/304響應緩存5分鐘}# 反向代理淘寶聯盟接口location /taobao/union/ {proxy_pass https://api.tbk.taobao.com/;proxy_set_header Host api.tbk.taobao.com; # 淘寶接口需指定正確Hostproxy_set_header X-Real-IP $remote_addr;}
}

四、兩種方案的對比與選型建議

維度CORS方案反向代理方案
適用環境生產環境(直接暴露真實API地址)開發/測試環境(隱藏真實API地址)
配置位置后端(Spring Boot)前端(Vue CLI)/服務器(Nginx)
安全性需嚴格控制AllowedOrigin(避免*)隱藏真實API,降低暴露風險
兼容性支持現代瀏覽器(IE10+)所有瀏覽器(無兼容性問題)
調試成本后端配置后前端無需修改前端需維護代理配置(多環境切換)

返利APP選型建議

  1. 開發環境:使用Vue CLI反向代理,快速調試無需后端配合;
  2. 測試環境:兩種方案均可,推薦CORS(模擬生產環境真實請求);
  3. 生產環境:核心API用CORS(細粒度權限控制),第三方接口(如淘寶聯盟)用Nginx反向代理(隱藏密鑰,避免前端暴露)。

通過上述方案,返利APP已徹底解決跨域問題,開發環境調試效率提升40%,生產環境跨域相關報錯率降至0。實際開發中需注意:CORS方案不要在生產環境使用AllowedOrigin: *(會與allowCredentials沖突),反向代理需配置正確的Host頭(避免后端接口因Host不匹配拒絕請求)。

本文著作權歸聚娃科技省賺客app開發者團隊,轉載請注明出處!

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

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

相關文章

【dl】python基礎 深度學習中需要用到的python基礎

直接在jupyter寫筆記然后導出md格式真的太好用了本文筆記來自小破站視頻BV1K14y1c75ePython 基礎 1. 變量 1.1 三種基本變量類型 # 字符串 str str_v "123"# 數字 int或float num_v 11 float_v 12.0# 布爾型 bool bool_v True1.1.1 字符串 f字符串:在…

Vue FullPage.js 完整使用指南:Vue 3 官方全屏滾動解決方案

概述 vue-fullpage.js 是 FullPage.js 的官方 Vue.js 3 包裝器,為 Vue 3 應用提供了強大的全屏滾動功能。該插件基于成熟的 FullPage.js 庫,支持多種滾動效果和豐富的配置選項,特別適用于企業級數據大屏、產品展示、單頁應用等場景。 官方信…

軟件工程實踐一:Git 使用教程(含分支與 Gitee)

文章目錄目標一、快速上手1. Windows 安裝 Git2. 初始化 / 克隆二、核心概念速覽三、常用命令清單1) 查看狀態與差異2) 添加與提交3) 歷史與回溯4) 撤銷與恢復(Git 2.23 推薦新命令)5) 忽略文件四、分支與合并(Branch & Merge&#xff09…

css`min()` 、`max()`、 `clamp()`

min() 用來計算多個數值中最小的那個,非常適合做自適應。 width: min(50vw, 500px) 50vw 表示 視口寬度的 50% 500px 表示 500px min(50vw, 500px) 表示會取兩者中 最小的那個 作為最終的寬度,。 使用場景 限制某個元素寬度不超過某個值; 響…

【WRF-VPRM 預處理器】HEG 安裝(服務器)-MRT工具替代

目錄 HEG 安裝 驗證 HEG 安裝與否 設置環境變量(建議) 命令行接口(Command Line Interface) hegtool 工具 hegtool 用法 Header File 格式 功能1:`gdtif` 工具 – MISR 數據處理 `gdtif` 使用方式 參數文件格式(Parameter File Format) 功能2:`resample` 工具 – 重采樣…

PyTorch 神經網絡

神經網絡是一種模仿人腦神經元鏈接的計算模型, 由多層節點組成, 用于學習數據之間的復雜模式和關系。神經網絡通過調整神經元之間的連接權重來優化預測結果,這個過程可以涉及到向前傳播,損失計算,反向傳播和參數更新。…

詳細解析蘋果iOS應用上架到App Store的完整步驟與指南

📱蘋果商店上架全流程詳解 👩?💻想要將你的App上架到蘋果商店?跟隨這份指南,一步步操作吧! 1?? 申請開發者賬號:訪問蘋果開發者網站,注冊并支付99美元年費,獲取開發者…

三維GIS開發實戰!Cesium + CZML 實現火箭飛行與分離的 3D 動態模擬

CZML是一種基于JSON的數據格式,專門用于在Cesium中描述3D場景和時間動態數據。本文將詳細介紹了CZML的特點(JSON格式、時間動態性、層次結構等)和基本組件,并給出了一個火箭發射的實例。通過搭建Cesium開發環境(使用vi…

Spring Boot 深入剖析:BootstrapRegistry 與 BeanDefinitionRegistry 的對比

在 Spring Boot 的啟動過程中,BootstrapRegistry 和 BeanDefinitionRegistry 是兩個名為“Registry”卻扮演著截然不同角色的核心接口。理解它們的差異是深入掌握 Spring Boot 啟動機制和進行高級定制開發的關鍵。BootstrapRegistry public static ConfigurableAppl…

貪心算法應用:速率單調調度(RMS)問題詳解

Java中的貪心算法應用:速率單調調度(RMS)問題詳解 1. 速率單調調度(RMS)概述 速率單調調度(Rate Monotonic Scheduling, RMS)是一種廣泛應用于實時系統中的靜態優先級調度算法,屬于貪心算法在任務調度領域的經典應用。 1.1 基本概念 RMS基于以下原則&…

Cesium4--地形(OSGB到3DTiles)

1 OSBG OSGB(OpenSceneGraph Binary)是基于 OpenSceneGraph(OSG) 三維渲染引擎的二進制三維場景數據格式,廣泛用于存儲和傳輸傾斜攝影測量、BIM、點云等大規模三維模型,尤其在國產地理信息與智慧城市項目中…

多語言共享販賣機投資理財共享售賣機投資理財系統

多語言共享販賣機投資理財/共享售賣機分紅/充電寶/充電樁投資理財系統 采用thinkphp內核開發,支持注冊贈金、多級分銷,功能很基礎 修復后臺用戶列表管理 可自定義理財商品 多種語言還可以添加任意語言 源碼開源 多級分銷 注冊贈金等

[Windows] PDF 專業壓縮工具 v3.0

[Windows] PDF 專業壓縮工具 v3.0 鏈接:https://pan.xunlei.com/s/VOZwtC_5lCF-UF6gkoHuxWMoA1?pwdchg8# PDF 壓縮工具 3.0 新版功能特點 - 不受頁數限制! 一、核心壓縮功能 1.多模式智能壓縮 支持 4 種壓縮模式:平衡模式&#xff08…

SHEIN 希音 2026 校招 內推 查進度

SHEIN 希音 2026 校招 內推 查進度 🏢公司名稱:SHEIN 希音 💻招聘崗位:前端、后端、測試、產品、安全、運維、APP 研發、數據分析、設計師、買手、企劃、招商、管培生 🌟內推碼:NTA2SdK 💰福利待…

ARM (6) - I.MX6ULL 匯編點燈遷移至 C 語言 + SDK 移植與 BSP 工程搭建

回顧一、核心關鍵字:volatile1.1 作用告訴編譯器:被修飾的變量會被 “意外修改”(如硬件寄存器的值可能被外設自動更新),禁止編譯器對該變量進行優化(如緩存到寄存器、刪除未顯式修改的代碼)。本…

Vue中使用keep-alive實現頁面前進刷新、后退緩存的完整方案

Vue中使用keep-alive實現頁面前進刷新、后退緩存的完整方案 在Vue單頁應用中,路由切換時組件默認會經歷完整的銷毀-重建流程,這會導致兩個典型問題:從搜索頁跳轉到列表頁需要重新加載數據,而從詳情頁返回列表頁又希望保留滾動位置…

Visual Studio Code 安裝與更新故障排除:從“拒絕訪問”到成功恢復

Visual Studio Code 安裝與更新故障排除:從“拒絕訪問”到成功恢復的實踐分析 摘要: 本文旨在探討 Visual Studio Code (VS Code) 在安裝與更新過程中常見的故障,特別是涉及“拒絕訪問”錯誤、文件缺失以及快捷方式和任務欄圖標異常等問題。…

簡單UDP網絡程序

目錄 UDP網絡程序服務端 封裝 UdpSocket 服務端創建套接字 服務端綁定 運行服務器 UDP網絡程序客戶端 客戶端創建套接字 客戶端綁定 運行客戶端 通過上篇文章的學習,我們已經對網絡套接字有了一定的了解。在本篇文章中,我們將基于之前掌握的知識…

如何解決 pip install 安裝報錯 ModuleNotFoundError: No module named ‘requests’ 問題

Python系列Bug修復PyCharm控制臺pip install報錯:如何解決 pip install 安裝報錯 ModuleNotFoundError: No module named ‘requests’ 問題 摘要 在日常Python開發過程中,pip install 是我們最常用的依賴安裝命令之一。然而很多開發者在 PyCharm 控制臺…

解釋 ICT, Web2.0, Web3.0 這些術語的中文含義

要理解“ICT Web2.0”術語的中文含義,需先拆解為 ICT 和 Web2.0 兩個核心概念分別解析,再結合二者的關聯明確整體指向: 1. 核心術語拆解:中文含義與核心定義 (1)ICT:信息與通信技術 中文全稱&am…