前端跨域问题各种解决方案

前端中跨域问题的CORS配置与解决方案 本文系统总结了前端开发中的跨域问题及CORS解决方案。首先介绍了CORS基础概念,包括同源策略和两种请求类型(简单请求与复杂请求)。文章详细阐述了三种后端CORS配置方案和Nginx配置方法,并提供了常见问题修复表。最后对比分析了四种前端跨域方案的优缺点,建议根据实际应用场景选择合适方案。通过正确配置CORS和选择适当跨域技术,可以有效解决前端跨域问题,提升应用稳定性和用户体验。 阅读详情


本文来自作者 npc光明 在 GitChat 上分享 「前端跨域问题各种解决方案」,「阅读原文」查看交流实录。

「文末高能」

编辑 | 哈比

什么是跨域

域(Domain)是网络中独立运行的单位,域之间相互访问则需要建立信任关系(即 Trust Relation)。信任关系是连接在域与域之间的桥梁。

当一个域与其他域建立了信任关系后,2 个域之间不但可以按需要相互进行管理,还可以跨网分配资源,使不同的域之间实现网络资源的共享与管理。

跨域访问是指,没有建立信任关系的两个域之间通讯,但是由于安全原因,跨域访问是被各大浏览器所默认禁止的。

哪些属于跨域

浏览器遵循同源次略,非同源即为跨域,非同源分为三种。

  • host 不一致;

  • 端口不一致;

  • 协议不一致。

上面三种,任意满足一种都是跨域,在请求的时候就会报错。

根据上面的原理,我们可以发现在开发中,我们在浏览器打开的我们本地页面地址和请求地址不在一个源中,所以产生了跨域。

解决跨域的方法和原理

我们知道了跨域的原理,那么开发中,应该如何解决这个问题呢?

反向代理

前面我们了解了,跨域问题的产生是因为浏览器的同源政策造成的,但是服务器与服务器之间的数据交换是没有这个限制。

反向代理就是采用这种方式,建立一个虚拟的代理服务器来接收 internet 上的链接请求,然后转发给内部网络上的服务器,并将从服务器上得到的结果,返回给 internet 上请求链接的客户端。

比如,我们常用的 gulp、grunt、webpack 这些脚手架都是通过这种原理解决的跨域。

具体实现:

1. 使用 gulp 脚手架解决跨域

gulp 中有两个解决跨域的包有 gulp-connect-proxy、http-proxy-middleware,拿 http-proxy-middleware 为例,需要与 gulp-connect 一起使用:

var gulp = require('gulp');                var proxy = require('http-proxy-middleware');            var connect = require('gulp-connect');            gulp.task('server', function() {                connect.server({                     root: 'app',                     livereload: true,                     host: 'localhost',                     port: "8080",                     middleware: function(req, res, next) {                       return [                                 proxy('/', {                                 target: 'targeturl',                                 changeOrigin: true                                    })                                ];                            }                        });                    });        gulp.task('default', ['server'], function() {                    });

2. 使用 grunt 脚手架解决跨域

grunt 和 gulp 其实是类似的,都是需要先连接本地服务,然后设置代理,grunt 使用的的跨域插件是 grunt-connect-proxy,需要与 grunt-contrib-connect 一起使用:

connect: {        options: {                   port: ‘8080‘,                   hostname: ‘localhost‘,                   protocol: ‘http‘,                   open: true,                   base: {                   path: ‘./‘,                    options: {                    index: ‘html/index.html‘                            }                        },                        livereload: true                    },                    proxies: [                        {                            context: ‘/‘ + API_NAME,                            host: ‘localhost‘,                            port: ‘8080‘,                            https: false,                            changeOrigin: true,                            rewrite: proxyRewrite                        }                    ],                    default: {},                    proxy: {                        options: {                            middleware: function (connect, options) {                            if (!Array.isArray(options.base)) {                                    options.base = [options.base];                                }                // Setup the proxy                var middlewares = [require(‘grunt-connect-proxy/lib/utils‘).proxyRequest];                // Serve static files.                options.base.forEach(function (base) {                    middlewares.push(serveStatic(base.path, base.options));                });                // Make directory browse-able.                /*var directory = options.directory || options.base[options.base.length - 1];                 middlewares.push(connect.directory(directory));                 */                return middlewares;             }           }         }        }

3. 使用 grunt 脚手架解决跨域

webpack 如今在前端的三大框架中使用的比较广泛,我们以 vue 为例子,vue-cli 中 config/index.js 中是这样配置代理的:

port: 8090,        proxyTable: {                    '/': {                     target: targeturl,                     changeOrigin: true,                     pathRewrite: {                          '^/': '/'                          },                       }             }

我们可以看到,这三种方式都是需要本地先开启服务的,target 配置请求服务器的地址,    Rewrite 配置代理规则,    changeOrigin 设为 true 意思是同意将主机头的来源更改为目标 URL。

这种代理解决跨域,前端正常写 ajax 就行。

Jsonp

Jsonp 是通过 web 页面所有拥有 src 属性的标签都拥有跨域能力的属性,使客户端通过像调用脚本一样的方式,调用跨域服务器生成的 js 格式文件来获取数据。

具体实现如下。

服务端代码:

router.get('/jsonp', function(req, res, next) {        var userName = req.query.uname;        var password = req.query.pwd;        var data = {            code: 200,            user: userName,            password: password        }        res.jsonp(data);        });

前端端代码:

$.ajax({        async: true,        url: "http://localhost:3000/jsonp",        type: "GET",        dataType: "jsonp", // 返回的数据类型,设置为 JSONP 方式        jsonp: 'callback', // 指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback        jsonpCallback: 'xxx', // 设置回调函数名        data: {            "uname": 'jsonp',            "pwd": "456"        },        success: function(response, status, xhr) {            console.log(response);        },        });

扫描下方二维码,阅读完整原文

web前端跨域问题简介及其常见解决方案 前言 最近在做一个小web项目,需要从一个接口获取XML数据,具体数据用浏览器可以直接打开,大概长这样: 其实就是一些球赛的数据。。。 然后神奇的是,当我在自己的站点尝试用ajax去获取数据的时候,竟然有如下的报错信息: Access to XMLHttpRequest at 'http://free.win007.com/vbsxml/change.xml’from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-A 阅读详情

相关推荐

前端跨域请求的问题-解决方案

前端跨域请求问题是Web开发中常见的一个挑战,尤其是在现代Web应用中,前端经常需要从不同的源(即协议、域名或端口不同的服务器)请求数据。由于浏览器的同源策略(Same-origin policy),当尝试从一个源加载另一个源的资源时,浏览器会出于安全考虑阻止这些请求。本文将详细解释前端跨域请求的问题,并介绍几种常见的解决方案。

Good_tea_h的博客 1053

grunt-connect-proxy解决开发时跨域问题

最近的项目中前后端是完全分离开发的,前端用grunt管理项目。这样就会导致一个问题:开发时前端调用后台的接口时因为不在一个服务器,所以会出现跨域问题。但是也不能用JSONP或CROS方式实现真正的跨域,因为项目发布时其实是在同一个服务器下的。 这时候我们的grunt-connect-proxy就出场了,它就是专门解决这个问题的。 具体配置: 1. 先下载安装这个组件 npm install...

weixin_34049032的博客 549

PointNet/PointNet++模型调参实战:如何用PyTorch让你的点云分割精度再涨5个点?

本文深入探讨了PointNet/PointNet++模型在点云分割中的调参技巧,通过PyTorch实现精度提升5个点的实战方法。重点分析了点云密度自适应策略、感受野与细节保留的平衡,以及训练加速与稳定性技巧,适用于电力巡检、自动驾驶等场景的激光点云数据处理。

weixin_30836759的博客 477

这些node开源工具你值得拥有(下)

❝前言:前端时间分享了这些node开源工具你值得拥有(上) 主要围绕git、npm、命令行工具、加解密工具、数据校验、文档生成工具等方面。通过现成的轮子来提升我们的开发效率,来解决在不同场...

u013655559的博客 441

VS2015+C++实战:手把手教你用海康MVS里的Demo搞定多相机同步采图与保存

本文详细解析了在VS2015+C++环境下,利用海康威视MVS工业相机SDK实现多相机同步采图与保存的全流程。从环境准备、SDK选择到多相机初始化、同步采图方案,再到异常处理与性能优化,提供了实战技巧和代码示例,帮助开发者快速掌握工业相机二次开发的核心技术。

weixin_29170327的博客 280

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

谷歌浏览器插件开发跨域问题(完美解决)

谷歌浏览器插件开发跨域问题(完美解决)跨域问题解决方法先配置manifest.json文件创建background脚本:GET请求background脚本POST请求background脚本调用方法 跨域问题 了解Content Security Policy(CSP): Manifest V3引入了一种名为Content Security Policy (CSP) 的新安全模型。确保你的插件的代码和外部资源遵循CSP规则,以避免可能的安全问题。 报错代码如下Access to fetch at ‘http

qq_66579387的博客 8260

Shader Graph入门

Shader Graph 简介

zaizai1007的博客 1万+

跨域的十种解决方案详解(总结)

小菜鸟在总结

MoXinXueWEB的博客 8363

30分钟用 Restful ABAP Programming(RAP)模型开发一个支持增删改查的 Fiori 应用

2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Driven Development,即通过开发维护了对应annotation(注解)的CDS view,结合SAP WebIDE,能够花费最少的编程代价,就能够在短时间内获得一个支持增删改查的Fiori应......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5951

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9653

前端开发中出现的跨域问题以及解决方案

跨域是指浏览器出于安全考虑,实施了"同源限制"(Same-Origin Policy),使得一个源(Origin)的文档或脚本无法访问另一个源的资源。源由协议(如httphttps)、域名(如)、端口号(如8080)共同定义。只要三者中有一个不同,就被认为是跨域。跨域问题是前端开发中常见的问题,但通过上述解决方案,可以有效地解决跨域问题。简单GET请求:可以使用JSONP。前后端分离:推荐使用CORS。生产环境:可以配置Nginx反向代理。开发环境:可以使用Node中间件代理。实时通信。

2401_82591622的博客 1264

RK3576 USB3.0 DWC3控制器调试:PHY初始化失败排查指南

DWC3 是 Synopsys 公司推出的 USB3.0/3.1 控制器 IP,支持双角色(DRD)模式,可配置为 Host、Device 或 OTG。

小灰灰的博客 1177

【前端充电】跨域问题及解决方案

同源策略是浏览器为确保资源安全,而遵循的一种策略,该策略对访问资源进行了一些限制。W3C 上对同源策略的说明。源的组成部分下面表格中,只有最后一行的两个源是同源。源 1源 2是否同源httphttps⛔非同源️http://wwwhttp://mail⛔非同源8080/home8090/home⛔非同源homesearch✅同 源︎所处源:所处位置 / 浏览器地址栏出现的地址 / 网页的地址。同源请求非同源请求同源请求:所处源和目标源是同源的。非同源请求:所处源和目标源不是同源的。

qq_37581764的博客 1017

图像增强算法:基于Retinex的图像增强算法

该算法对图像的亮度和颜色进行分离处理,然后通过调整它们的比例来提高图像的质量。滤波后的图像将保留颜色信息,并减少图像中的噪声。接下来,Retinex算法使用一个高通滤波器对原始图像进行滤波处理,以增强图像中的亮度信息。通过使用Retinex增强算法,我们可以有效地提高图像的质量,增强图像中的细节和颜色信息。最后,Retinex算法通过将颜色恢复和亮度调整后的图像进行比例调整,以获得最终的增强图像。Retinex算法是一种常用的图像增强算法,它通过对图像的亮度和颜色进行调整,以提高图像的视觉质量。

XsiJava的博客 436

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

剖析跨域问题始末及其解决方案——前端必备交叉知识(一)

跨域问题是前端开发中的常见挑战,了解并掌握不同的跨域解决方案能帮助你更高效地进行开发工作。本文对同源策略、跨域以及解决跨域的三种方案: CORS、JSONP、代理等跨域技术进行了介绍。选择合适的跨域解决方案非常重要。

RenGJ010617的博客 4448

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

vue + web 前端访问后端,跨域问题解决方案

前端可以通过axiso解决跨域问题,vue、vue2、vue3版本的跨域配置不同 后端也可以解决跨越问题,只需要修改添加过滤器即可 import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IO...

IT界的一只菜鸟 7317

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

前端 | 跨域问题的前后端解决方案

跨域问题的前后端解决方案

野生猿林仔的博客 2570

前端跨域问题原因及解决方案

跨域是如何形成的? 当我们请求一个url的 协议、域名、端口三者之间任意一个与当前页面url的协议、域名、端口 不同这种现象我们把它称之为跨域 跨域会导致: 1、无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB 2、无法接触非同源网页的 DOM 3、无法向非同源地址发送 AJAX 请求(可以发送,但浏览器会拒绝接受响应) 导致跨域的根本原因是请求浏览器的同源策略导致的 ,而跨域请求报错的原因是: 浏览器同源策略 && 请求是ajax类型 &&

棠樾的博客 9991

前端跨域问题全解析:原理、解决方案与最佳实践

CORS(Cross-Origin Resource Sharing)是 W3C 定义的一种机制,:安全性高,支持复杂请求(POST、PUT、DELETE)。跨域(Cross-Origin Request)是指。跨域问题是 Web 开发中不可避免的问题,但通过。:需要后端支持,不适用于第三方 API。,可以轻松解决不同场景下的跨域需求。其中任何一个不同,就会触发跨域。,跨域问题都是一个绕不开的挑战。,提供实战示例和最佳实践。限制了不同源之间的请求。通过 Nginx 代理,,Nginx 会代理到。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 2185

前端跨域问题解决方案

跨域产生的原因是由于浏览器的同源策略,即当页面的源和页面运行过程中加载的源不一致时,浏览器会出于安全考虑对跨域的资源访问进行限制。这种限制特别是对​ajax的影响最为明显,默认情况下,它不允许ajax访问跨域资源。

lbking666666的专栏 3667

前端跨域问题汇总及解决方案

“关注前端开发社区,回复“ 1”即可加入前端技术交流群,回复“ 2”即可免费领取500G前端干货! 来源 |https://segmentfault.com/a/1190000012158485 跨域问题的场景和解决方案多种多样,只要是做前端开发,总会遇到。而且面试时也是必问的问题。所以自己学习总结记录一下。 因为浏览器的同源策略,前端开发会遇到各种跨域问题。本篇文章总结了遇到跨域问题的不同的场景以及对应的解决方案。 前言 在总结各种跨域问题之前,我们先来了解一下浏览器...

weixin_44991965的博客 3741

【NextJS】跨域问题的产生及前端解决方案——本地代理

本文介绍了在React/Next.js开发中遇到的跨域问题及解决方案

XPRNB的博客 901

jq跨域代理_JQuery前端跨域问题的七种解决方案

下面我们来看下跨域访问的原理和实现方式一,跨域原理分析:应用同源策略轻松实现跨域1.所谓同源是指,域名,协议,端口相同。当浏览器运行一个JS脚本时会进行同源检测,如果不同源是不能执行的。2.源继承来自about:blank,javascript:和data:URLs中的内容,继承了将其载入的文档所指定的源,因为它们的URL本身未指定任何关于自身源的信息。3.变更源变更源可以实现基础域相同的不同页面...

weixin_39806288的博客 3746
上一篇: 工作之余如何高效学习
下一篇: 最新版 TensorFlow 快速入门
软件供应链安全
软件供应链安全 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 347原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值