关于跨域问题的个人理解

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

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

  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等工具进行部署。

具体实现

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python3】【力扣题】268. 丢失的数字

【力扣题】题目描述: 【Python3】代码: 1、解题思路:哈希。元素去重,依次判断是否在0-n内,没有则返回。 知识点:set(...):转为集合,集合中的元素不重复。 class Solution:def mis…

【Spring Boot】034-Spring Boot 整合 JUnit

【Spring Boot】034-Spring Boot 整合 JUnit 文章目录 【Spring Boot】034-Spring Boot 整合 JUnit一、单元测试1、什么是单元2、什么是单元测试3、为什么要单元测试 二、JUnit1、概述简介特点 2、JUnit4概述基本用法 3、JUnit5概述组成 4、JUnit5 与 JUnit4 的常用注解对比 三…

【SpringBoot3+Vue3】二【实战篇】-后端

目录 一、环境搭建 1、数据库脚本 2、pom 3、yml 4、通过mybatis-X生成实体pojo等 4.1 Article 4.2 Category 4.3 User 5、 Mapper 5.1 ArticleMapper 5.2 CategoryMapper 5.3 UserMapper 6、service 6.1 ArticleService 6.2 CategoryService 6.3 UserService …

【2021集创赛】 RISC-V杯三等奖:基于E203 处理器的SM4算法硬件加速

杯赛题目:基于蜂鸟E203 RISC-V处理器内核的SoC设计 参赛要求:研究生组/本科生组 赛题内容: 基于芯来科技的开源蜂鸟E203 Demo SoC进行扩展,在限定的可编程逻辑平台上构建面向专用应用领域(譬如人工智能、信息安全、工业…

基于springboot实现小学家校一体“作业帮”系统项目【项目源码】计算机毕业设计

基于springboot实现小学家校一体“作业帮”系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具…

实战Leetcode(四)

Practice makes perfect! 实战一: 这个题由于我们不知道两个链表的长度我们也不知道它是否有相交的节点,所以我们的方法是先求出两个链表的长度,长度长的先走相差的步数,使得两个链表处于同一起点,两个链…

Python爬虫从基础到入门:认识爬虫

Python爬虫从基础到入门:认识爬虫 1. 认识爬虫2. 开始简单的爬虫操作(使用requests)3. 辨别“数据”是静态加载还是动态生成的1. 认识爬虫 爬虫用自己的话说其实就是利用一定的编程语言,到网络上去抓取一些数据为自己所用。那为什么要用爬虫呢?自己直接到网页上去copy数据它…

个人编程助手: 训练你自己的编码助手

在编程和软件开发这个不断演变的领域中,对效率和生产力的追求催生了许多卓越的创新。其中一个显著的创新就是代码生成模型的出现,如 Codex、StarCoder 和 Code Llama。这些模型在生成类似人类编写的代码片段方面表现出惊人能力,显示出了作为编…

MySQL的SQL预编译及防SQL注入

文章目录 1 SQL语句的执行处理1.1 即时SQL1.2 预处理SQL1.2.1 预编译SQL的实现步骤1.2.2 预编译SQL的C使用举例1.2.3 MYSQL_BIND()函数中的参数类型: 2 SQL注入2.1 什么是SQL注入2.2 如何防止SQL注入 1 SQL语句的执行处理 SQL的执行可大致分为下面两种模式&#xf…

《视觉SLAM十四讲》-- 后端 1(下)

8.2 BA 与图优化 Bundle Adjustment 是指从视觉图像中提炼出最优的 3D 模型和相机参数(内参和外参)。 8.2.1 相机模型和 BA 代价函数 我们从一个世界坐标系中的点 p \boldsymbol{p} p 出发,把相机的内外参数和畸变都考虑进来,…

黄执中老师人际说服课思考总结(个人笔记整理 ②)

前言: 沟通和说服的区别:为什么沟通不能解决问题,处于劣势的一方(承受问题的那方)才想去沟通(对方没有沟通动力)。说服是温柔而有力的学科 - 劣势一方的武器。 说服是一门影响人的学问&#xff…

golang工程组件——redigo使用(redis协议,基本命令,管道,事务,发布订阅,stream)

redisgo redis 与 client 之间采用请求回应模式,一个请求包对应一个回应包;但是也有例外,pub/sub 模 式下,client 发送 subscribe 命令并收到回应包后,之后被动接收 redis 的发布包;所以若需要使 用 pub/s…