返利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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…