关于跨域问题的个人理解

我也工作蛮多年了,期间既做过前端也做过后端。对于跨域问题,究竟是由前端程序员还是后端程序员来解决,我在不同的时期有不同的理解。现在,我更倾向于认为跨域问题应该由前端程序员来解决,即使在解决跨域问题的过程中涉及到一些服务端的知识。

我的这种观点主要基于以下几个理由:

  1. 跨域问题的根源在于浏览器的同源策略。这是一种浏览器为了保障用户信息安全而设定的规则,因此,解决跨域问题本质上就是对浏览器行为的处理,这应当属于前端的职责。
  2. 跨域问题发生在页面向服务端发送请求的过程中。这个过程是在前端进行的,所以前端程序员更直接面对这个问题。
  3. 如果跨域问题应该由后端程序员解决,那么在前端程序员的面试中,为什么经常会被问到如何解决跨域问题呢?这似乎暗示着,解决这个问题是前端程序员的责任。

而总的来说,我认为前端程序员应该主导解决跨域问题,尽管可能需要一些服务端的知识。当然以上只是我个人的观点,实际工作中,前端和后端的协作是非常重要的,两者都需要理解和处理跨域问题。

浏览器的同源策略

浏览器的同源策略是一种安全策略,它限制了不同源之间的资源访问和DOM操作。如果两个页面拥有相同的协议、端口和域名,那么它们就属于同一个源。同源策略主要限制了以下几个方面:

  1. DOM层面:不同源站点之间不能相互访问和操作DOM。
  2. 数据层面:不能获取不同源站点的Cookie、LocalStorage、indexDB等数据。
  3. 网络层面:不能通过XMLHttpRequest向不同源站点发送请求。
    这些限制是为了保护用户的信息安全,防止恶意网站获取其他网站的数据。不过,同源策略并不是绝对隔离不同源的站点,比如link、img、script标签都没有跨域限制。

在实际开发中,如果需要解决跨域问题,可以采用以下几种方式:

  1. 前端JS:使用JSONP等方式解决跨域问题。
  2. 后端:使用CORS(跨域资源共享)等插件,或者通过token/cookie等方式解决跨域问题。
  3. 服务端:使用nginx等反向代理服务器来解决跨域问题。

总的来说,浏览器的同源策略是一种重要的安全机制,但在实际开发中也需要灵活应对,选择合适的解决方案来处理跨域问题。

tips:
上面这段介绍是ai生成的,我这里要写的当然不是说前端如何用jsonp来解决跨域问题,只是为了简单介绍下,担心有的看这篇文章的人不知道

跨域问题是如何发生的

实现我默认看本篇文章的朋友都是知道浏览器的同源策略哈,(不知道那就没法往下写了)

现在有个页面访问地址为http://127.0.0.1:8080,
在这里插入图片描述

而API服务器访问地址为http://127.0.0.1:80
在这里插入图片描述

很明显,当8080端口的页面访问80端口的API发起请求时,就会触发浏览器的同源策略的保护,从而产生跨域的报错

为了更为直观一点,我吧两份源码都贴上来,
tips: 代码不必要的地方已尽力精简,防止有不熟悉的朋友看不懂

这是前端的,getNodeAPI方法会访问服务端http://127.0.0.1,并将服务端返回的结果在控制台打印,每当页面加载的时候,就会调用这个方法
在这里插入图片描述

这是服务器端的,这段代码是一个简单的Node.js HTTP服务器的实现,当有人访问它时,它会将“hello node”和请求的URL作为响应发送回去,并在控制台输出相关消息
在这里插入图片描述

(报的错还不少,装的插件太多了)
这里我们只需要关注第一个报错,意思是遇到的问题是由于浏览器的跨源资源共享(CORS)策略阻止了你从 ‘http://localhost:8080’ 这个源向 ‘http://127.0.0.1/’ 这个源发送请求。这是因为CORS策略要求服务器在响应头中包含 ‘Access-Control-Allow-Origin’ 这个头部,以表明哪些源可以访问这个资源
在这里插入图片描述

当遇到跨域问题时,后端通常采取的策略是设置白名单。然而,在前端领域中,跨域问题的范畴并不仅限于页面,更应该让API服务器开启白名单。这是因为在实际工作中,一个API服务器不仅要服务于Web端请求,还需要支持iOS、小程序等其他服务的请求。在开发多端产品或跨部门联动业务时,这种情况尤为常见。跨域问题只发生在页面与服务器端的请求过程中,而作为API服务的提供者,更应该关注接口的稳定性、通用性、高并发和性能等方面。因此,将针对Web端的跨域问题交给Web端程序员自己处理更为合适。

前端程序员解决跨域问题主要有两种方法:配置Nginx反向代理和搭建BFF层。由于配置Nginx反向代理较为普遍,下面将重点介绍搭建BFF层的方法。

BFF(Backend For Frontend)是一种针对前端的后端架构模式,旨在为前端提供专用的API接口,以满足前端的特定需求。BFF层可以作为前端和后端之间的中间层,处理跨域问题、数据聚合、接口适配等任务。通过搭建BFF层,前端程序员可以更好地掌握和控制前端请求的流程和数据,提高开发效率和代码质量。

搭建BFF层的步骤如下:

  1. 明确前端需求:首先,需要明确前端的需求和目标,例如需要访问哪些后端服务,需要哪些数据等。
  2. 设计API接口:根据前端需求,设计BFF层的API接口。这些接口应该符合前端的需求,并提供必要的数据和功能。
  3. 实现BFF层:根据设计的API接口,实现BFF层的代码。可以采用各种编程语言和框架,例如Node.js、Python、Java等。
  4. 调用后端服务:在BFF层中,需要调用后端服务来获取数据和执行功能。可以采用HTTP请求、RPC调用等方式与后端服务进行通信。
  5. 处理跨域问题:在BFF层中,可以处理跨域问题。例如,可以通过添加CORS头部或使用JSONP等方式来解决跨域问题。
  6. 测试和部署:完成BFF层的实现后,需要进行测试和部署。可以采用自动化测试工具进行测试,并使用Docker、Kubernetes等工具进行部署。

具体实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/147559.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全志R128基础组件开发指南——图像采集

图像采集 CSI(DVP) 图像采集 SENSOR -> CSI 通路 CSI (CMOS sensor interface)接口时序上可支持独立 SYNC 和嵌入 SYNC(CCIR656)。支持接收 YUV422 或 YUV420 数据。 VSYNC 和HSYNC 的有效电平可以是正极性,也可…

计算机网络之物理层

物理层 1. 物理层的基本概念 2.物理层下面的传输媒体 传输媒体可分为两类,一类是导引型传输媒体,另一类是非导引型传输媒体。 3.传输方式 3.1 串行传输和并行传输 串行传输:串行传输是指数据是一个比特依次发送的,因此在发送端…

如何使用Servlet写一个简单的网站

文章目录 前言1. 创建项目2. 引入依赖3. 创建目录4. 编写代码5. 打包程序6. 部署7.验证程序将 tomcat 集成到 idea 中 前言 前面我们学习了Java中常用的 HTTP 服务器 tomcat 的安装和使用,那么今天我们将使用这个 HTTP 服务器为大家写一个简单的网站,这…

AI技术如何融合应用于工业物联网

人工智能技术在近年来得到飞跃性地发展,在自主识别、分析、判断、规划等功能方面都进步显著,也已经应用于越来越多的行业产业。 在工业物联网领域,人工智能也将成为一大助力,通过与工业物联网系统集成融合,能够为工业…

Word多出一页空白页删不掉?这5个方法要记好!

“我在用Word编写文档时经常会遇到一个问题,文档排版都完成了,但是总会有一个空白页是无法删掉的,怎么解决这个问题呢?请大家帮帮我!” 在使用Word编辑文档时,可能很多用户有时都会遇到一个常见问题&#x…

小型洗衣机哪个牌子质量好?性价比高的迷你洗衣机推荐

这两年内衣洗衣机可以称得上较火的小电器,小小的身躯却有大大的能力,一键可以同时启动洗、漂、脱三种全自动为一体化功能,在多功能和性能的提升上,还可以解放我们双手的同时将衣物给清洗干净,让越来越多小伙伴选择一款…

vue中bus的详细使用

vue中关于兄弟组件bus的使用方法 首先,bus可以用在任何组件之间的传值 废话不多说,请看下面代码解说 首先,先创建bus.js文件,然后在引用,这里有两种引用方法:局部引用和全局引用。 // bus.js文件内容 imp…

客服易中招的3大常见职业病及缓解方法分享

1️⃣无论和谁聊天都可以“亲”~“亲亲”我也很无奈,但真的习惯了(其实也不是什么病啦,还能让朋友觉得我性格变好了呢哈哈哈) 2️⃣鼠标手(腕管综合征)其实很多上班族都有这个职业病。但由于我们客服工作属…

OpenHarmony 开发者论坛正式上线,盖楼赢惊喜好礼~

你,是否曾遇到 OpenHarmony 开发难题,却不知找谁解答? 你,是否曾想分享 OpenHarmony 技术,但没有一个官方投稿平台? 你,是否想加入火热的 OpenHarmony 开源项目,却不知如何参与和贡…

Spring 只用一招,就摆脱被垃圾回收的命运,拯救了自己

SpringBoot ApplicationContext 会被 JVM 当成垃圾对象,然后回收掉吗? 最近五阳哥在复习JVM 垃圾回收的知识,被别人问到这个问题,我心里感到一惊,如果Spring 被回收掉,Spring管理的bean全部会被回收&#…

【Proteus仿真】【Arduino单片机】HC-SR04超声波测距

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、HC-SR04超声波传感器等。 主要功能: 系统运行后,LCD1602显示超声波检测距离。 二、软件设计 …

vcenter server (部署较大服务器)

作用 VMware vCenter是集中管理控制台,管理所有安装了VMware ESXI的主机 使用vCenter Server可以对虚拟机进行实时的监控,包括服务器硬件、网络和共享的存储,并可以进行故障诊断。 可以查看实时的统计和图表,监控虚拟主机和资源…

盘点49个Python网站项目Python爱好者不容错过

盘点49个Python网站项目Python爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1aFYJtNZjgst1l5KFBckP2A?pwd8888 提取码:8888 项目名称 A simpleshorturl…

使用vscode的ssh进行远程主机连接

1. 首先安装好“远程资源管理器”(这一步建议谷歌下),如下图所示 2. 按F1,设置远程主机信息的SSH Configuration config file, 注意这里可以添加多个远程主机信息,通过注释掉无关远程主机信息来选择想连接的那个主机&a…

国产双核DSP与 TI 的TMS320F28377 大PK

国产DSP,QX320F28377与 TI的 TMS320F28377 孰强孰弱

计算机毕业设计项目选题推荐(免费领源码)PHP+MySQL在线网络教育平台66984

目 录 摘要 1 绪论 1.1 课题背景 1.2意义 1.3HTML介绍 1.4JavaScript 运行模式 1.5css3工作原理 1.6论文结构与章节安排 2 在线网络教育平台分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 3 2.2.2数据修改流程 4 2.2.3数据删除流程 4 2.3 系统功能分析 …

新生儿吐奶:原因、科普和注意事项

引言: 新生儿吐奶是许多新父母常见的经历,尽管大多数情况下是正常的,但对于父母来说,了解吐奶的原因以及如何处理是至关重要的。本文将科普新生儿吐奶的原因,提供相关信息,并为父母和监护人提供注意事项&a…

第二篇 《随机点名答题系统》——题库管理详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.数据库设计 3.流程设计 4.关键代码 4.1.题库维护 4.1.1数据请求示意图 4.1.2添加题库(login.php)数据请求代码 4.1.3删除题库(login.php)数据请求代码 4.1.4 业务处理Service(tiKuService…

Redis最新2023年面试题高级面试题及附答案解析(1)【Redis最新2023年面试题高级面试题及附答案解析-第三十八刊】

文章目录 Redis最新2023年面试题高级面试题及附答案解析(1)01、为什么 Redis 需要把所有数据放到内存中?02、查看 Redis 使用情况及状态信息用什么命令?03、MySQL里有2000w数据,Redis 中只存20w的数据,如何保证 Redis 中的数据都是…

Spring Boot MyBatis Plus 配置数据源详解

文章目录 1. 引入 MyBatis Plus 依赖2. 数据源配置3. MyBatis Plus 配置4. 动态数据源配置(多数据源)5. 小结 🎉欢迎来到架构设计专栏~Spring Boot MyBatis Plus 配置数据源详解 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&…