如何解决跨域问题?

一,什么是跨域

域(Origin)是由协议、域名和端口组成的,只有这三者完全一致的情况下,浏览器才会认为两个网址同源,否则就认为存在跨域。跨域是指在Web开发中,一个网页的JavaScript代码试图访问另一个域(网站)下的资源,如发送Ajax请求、读取Cookie、操作DOM等。

当一个请求url的协议,域名,端口三者之间任意一个与当前的url不同都即为跨域

从http://localhost:8601  到   http://localhost:8602  由于端口不同,是跨域。

从http://192.168.101.10:8601  到   http://192.168.101.11:8601  由于主机不同,是跨域。

从http://192.168.101.10:8601  到   https://192.168.101.10:8601  由于协议不同,是跨域。

注意:服务器之间不存在跨域请求。

跨域访问存在安全风险,因为不同的域名可能代表不同的网站,一个域名下的恶意代码可能试图访问另一个域名下的敏感数据,从而导致信息泄露和安全问题。

为了限制跨域访问,浏览器实现了同源策略(Same-Origin Policy),该策略默认情况下阻止了不同域之间的大部分交互。

二,非同源限制

  1. DOM访问限制: 一个网页的JavaScript代码在访问另一个域下的DOM元素时受到限制。这意味着,如果一个网页试图通过JavaScript修改或操作不同域下的DOM元素,浏览器会阻止这种行为。

  2. Ajax请求限制: XMLHttpRequest 或 Fetch API 发起的Ajax请求默认受到同源限制,不能直接访问不同域下的资源。这是因为浏览器会检查请求的目标域是否与当前页面的域相同,如果不同,请求会被拒绝。

  3. Cookie限制: 不同域之间的 Cookie 信息通常是隔离的,一个域下的网页无法直接访问另一个域的 Cookie。

  4. 跨域脚本限制: 通过<script>标签引入的外部脚本通常可以跨域加载,但是它们在执行时的访问权限受到限制,例如无法访问其他域的全局变量和函数。

为了实现跨域访问,开发人员可以采用一些方法来绕过这些限制,例如使用服务器端代理、JSONP、CORS(Cross-Origin Resource Sharing)头部等。这些方法能够在服务器和客户端之间建立一些协议,以允许特定类型的跨域请求。

三,问题引入

我的前端放在8602端口,我的后端放在63110端口,然后我的前端需要去请求后端的数据,我用chrom浏览器,我按f12调试的时候发现报了这个错:

但是在edge浏览器中却没有报错,我就有点纳闷,然后搜了一下发现:

不同浏览器之间对跨域访问的限制程度可能会有所不同,这主要是因为每个浏览器厂商在实现同源策略(Same-Origin Policy)时可能会有一些差异。

就是说我这个属于因为端口不同跨域了,edge放我过去了chrom严一点就没放。

四,解决方案

 1,JSONP

通过script标签的src属性进行跨域请求,如果服务端要响应内容则首先读取请求参数callback的值,callback是一个回调函数的名称,服务端读取callback的值后将响应内容通过调用callback函数的方式告诉请求方。如下图:

它不是通过Ajax请求,他是通过JavaScript标签请求,可以请求跨域地址,但是如何拿到数据呢?

 JSONP的原理是利用<script>标签的跨域加载特性,通过在页面中动态创建<script>标签来加载一个外部脚本文件,而这个外部脚本文件是由服务器动态生成的,包含了要获取的数据,这个数据会被当作参数传递给一个预定义的回调函数,从而实现数据的跨域传输。

以下是JSONP的基本工作原理:

  1. 客户端(浏览器)发起请求: 客户端页面中的JavaScript代码通过创建一个<script>标签,将请求发送到其他域(服务器)。

  2. 服务器处理请求: 服务器接收到这个请求后,会根据请求参数动态生成一个包含要传递数据的JavaScript脚本。

  3. 服务器响应: 服务器将生成的JavaScript脚本作为响应返回给客户端。这个响应是一个可执行的脚本。

  4. 客户端解析响应: 浏览器解析服务器响应时,会立即执行脚本内容。这样,服务器返回的数据会被传递给预先定义好的回调函数。

由于<script>标签的加载不受同源策略的限制,所以可以在不同域之间加载脚本文件。JSONP的关键是要确保服务器返回的脚本内容调用了一个事先定义好的回调函数,并将数据作为参数传递给这个回调函数。客户端需要在页面中提前定义这个回调函数,以便在脚本加载并执行后,能够正确处理从服务器返回的数据。

说的直白一点就是,服务端会返回一个js函数给前端,这个js函数前端事先已经定义好了,所以前端拿到之后就会立即执行,所以前后端是需要统一这个js回调函数的名字的,服务端把需要的数据写在了这个js函数的参数里面,所以前端拿到这个js的参数就拿到了数据

JSONP的优点是简单易用,但也存在一些安全风险,因为它需要在客户端预先定义一个全局回调函数,可能会被恶意网站滥用。另外,JSONP只支持GET请求,无法发送其他类型的HTTP请求。

2,添加响应头

浏览器判断是跨域请求会在请求头上添加origin,表示这个请求来源哪里。

比如:

GET / HTTP/1.1
Origin: http://localhost:8601

服务器收到请求判断这个Origin是否允许跨域,如果允许则在响应头中说明允许该来源的跨域请求,如下:

Access-Control-Allow-Origin:http://localhost:8601

如果允许任何域名来源的跨域请求,则响应如下:

Access-Control-Allow-Origin:*

常见的响应头字段: 以下是一些常见的响应头字段以及它们的作用:

  • Access-Control-Allow-Origin: 在CORS中使用,指定允许访问资源的域。例如,Access-Control-Allow-Origin: *表示允许任意域访问资源。

  • Content-Type: 指定响应体的MIME类型,告诉浏览器如何解析和显示响应内容。

  • Cache-Control: 控制缓存策略,例如Cache-Control: no-cache表示禁止缓存。

  • Location: 在重定向响应中,指定新的URL地址。

  • Set-Cookie: 在响应中设置Cookie。

3,通过nginx代理跨域

由于服务端之间没有跨域,浏览器通过nginx去访问跨域地址。

1)浏览器先访问http://192.168.101.10:8601 nginx提供的地址,进入页面

2)此页面要跨域访问http://192.168.101.11:8601 ,不能直接跨域访问http://www.baidu.com:8601  ,而是访问nginx的一个同源地址,比如:http://192.168.101.11:8601/api ,通过http://192.168.101.11:8601/api 的代理去访问http://www.baidu.com:8601。

这样就实现了跨域访问。

浏览器到http://192.168.101.11:8601/api 没有跨域

nginx到http://www.baidu.com:8601通过服务端通信,没有跨域。

客户端浏览器发起跨域请求时,会先将请求发送到Nginx代理服务器,Nginx会将请求转发到目标域,然后将目标域的响应返回给客户端。客户端浏览器认为请求是从同源发起的,因为请求的域与客户端页面的域一致,从而避免了跨域问题。

 

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

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

相关文章

yolov8-制作数据集,数据集格式转换(yolo格式-voc格式)附完整代码

yolo训练时可使用的数据集格式为yolo格式以及voc格式&#xff0c; voc格式的数据集在训练时需要先转换为yolo格式&#xff0c;然后根据自己的数据集的位置更改yaml配置文件的文件路径即可。基于目前对Yolo系列训练模型的讲解已经很全面&#xff0c;所以本文主要讲解yolo数据集与…

aws中opensearch 日志通(Centralized Logging with OpenSearch)2.0(一)

aws日志通2.0 实现全面的日志管理和分析功能 一体化日志摄取 &#xff1a;把aws服务器日志和应用日志传输到opensearch域中无代码日志处理 &#xff1a;在网页控制台中就可以实现数据处理开箱即用 &#xff1a;提供可视化模版&#xff08;nginx、HTTP server &#xff09; 架构…

如何有效保障企业内部网络安全?好的方式是什么?

据统计&#xff0c;70%的数据泄露安全事故来源于企业内部。所以有效保障企业内部网络安全至关重要。但不少企业还不知道如何有效保障企业内部网络安全&#xff1f;也不知道有哪些好的方式&#xff1f;这里我们小编就跟大家来一起简单探讨一下。 什么是网络安全&#xff1f; 网…

【沁恒蓝牙mesh】CH58x系统时钟配置与计算

本文主要记录了【沁恒蓝牙mesh】CH58x系统时钟配置与计算 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&#x1f525;&#x1f389; 支持我&am…

Redis秒杀:一人一单问题及初步解决

优惠券秒杀一人一单 前言一、需求以及之前存在的问题二、增加一人一单逻辑1.初步代码2.封装一人一单逻辑3.控制锁的粒度 三、事务控制问题四、总结 前言 跟随黑马虎哥学习redis&#xff1a; 这是我认为b站上最好的redis教程&#xff0c;各方面讲解透彻&#xff0c;知识点覆盖…

【网络安全带你练爬虫-100练】第16练:使用session发送请求

目录 一、目标1&#xff1a;使用seesion进去请求 二、网络安全O 一、目标1&#xff1a;使用seesion进去请求 &#xff08;1&#xff09;应用&#xff1a; 通过创建会话&#xff08;session&#xff09;对象来请求并爬取返回的数据包 情景&#xff1a;需要登录才能爬取的网…

六、JVM-垃圾收集器浅析

垃圾收集器浅析 主 JVM参数 3.1.1 标准参数 -version -help -server -cp3.1.2 -X参数 非标准参数&#xff0c;也就是在JDK各个版本中可能会变动 -Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式&#xff0c;JVM自己来决定3.1.3 -XX参数 使用得…

四、JVM-对象内存模型

Java对象内存模型 一个Java对象在内存中包括3个部分&#xff1a;对象头、实例数据和对齐填充 数据 内存 – CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩技术 JDK1.6出…

elb 直接配置到后端服务器组

出现上图报错的原因是&#xff0c;前面elb配置了https证书&#xff0c;后端的nginx也配置了证书&#xff0c;导致冲突。 需要修改后端的nginx配置文件&#xff0c;将证书配置注释掉。 如果出现健康检查异常&#xff0c;需要在对应服务器的安全组上配置elb所在的网段的访问权限…

以CS32F031为例浅说国产32位MCU的内核处理器

芯片内核又称CPU内核&#xff0c;它是CPU中间的核心芯片&#xff0c;是CPU最重要的组成部分。由单晶硅制成&#xff0c;CPU所有的计算、接受/存储命令、处理数据都由核心执行。各种CPU核心都具有固定的逻辑结构&#xff0c;一级缓存、二级缓存、执行单元、指令级单元和总线接口…

PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展

PHP使用Redis实战实录系列 PHP使用Redis实战实录1&#xff1a;宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2&#xff1a;Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3&#xff1a;数据类型比较、大小限制和性能扩展 数据类型…

节日福利发什么?OI易问卷调查员工意见,“卷”赢其他公司

春节、妇女节、端午节、中秋节、元宵节、周年庆……近几年各公司之间的员工福利比拼“卷”上新高度&#xff0c;让HR、行政每逢佳节倍焦虑。 节日福利是表达公司对员工的关心和感谢&#xff0c;同时提高员工的归属感和满意度。礼品、购物券、节日慰问金、节日活动、食品饮料……

【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

[Linux]手把手教你制作进度条小程序

[Linux]制作进度条小程序 文章目录 [Linux]制作进度条小程序C语言中的\n和\r字符缓冲区的刷新策略进行进度条代码编写 C语言中的\n和\r字符 C语言中字符分为两种: 可显字符控制字符 其中可显字符就是字符a这类的字符&#xff0c;控制字符就是\n这种控制字符。 对于我们制作…

便捷就医新选择,深度解析诊所小程序的功能要求

随着移动互联网的快速发展&#xff0c;越来越多的诊所选择开发诊所小程序来提供便捷的医疗服务。诊所小程序是一种基于微信平台的轻量级应用程序&#xff0c;为用户提供在线挂号、诊疗记录查看、医生咨询等功能。本文将介绍诊所小程序的功能要求&#xff0c;以帮助诊所更好地了…

web集群学习--静态网页和动态网页的区别、WEB1.0和WEB2.0的区别、Tomcat安装以及部署jpress应用

1.静态网页和动态网页的区别 1.1概念 静态网页&#xff1a; 由在服务器上提前创建好的HTML文件组成&#xff0c;它的内容在用户请求页面时不会发生改变。当用户访问一个静态网页时&#xff0c;服务器会直接将预先准备好的HTML文件发送给用户的浏览器进行显示。因为静态网页的…

快速远程桌面控制公司电脑远程办公

文章目录 第一步第二步第三步 远程办公的概念很早就被提出来&#xff0c;但似乎并没有多少项目普及落实到实际应用层面&#xff0c;至少在前几年&#xff0c;远程办公距离我们仍然很遥远。但2019年末突如其来的疫情&#xff0c;着实打了大家一个措手不及。尽管国内最初的大面积…

改进粒子群算法优化BP神经网络---回归+分类两种案例

今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章&#xff1a;基于改进莱维飞行和混沌映射&#xff08;10种混沌映射随意切换&#xff09;的粒子群优化算法&#xff0c;附matlab代码 文章一次性讲解两种案例&#xff0c;回归…

C++如何用OpenCV中实现图像的边缘检测和轮廓提取?

最近有个项目需要做细孔定位和孔距测量&#xff0c;需要做边缘检测和轮廓提取&#xff0c;先看初步效果图&#xff1a; 主要实现代码&#xff1a; int MainWindow::Test() {// 2.9 单个像素长度um 5倍double dbUnit 2.9/(1000*5);// 定义显示窗口namedWindow("src"…

wedo2.0恐龙主题暑假班(搭建图纸、课程,海报,素材,视频等)

wedo2.0恐龙 前言&#xff1a; 图纸是roboriseit的&#xff0c;大家都知道roboriseit出品必属精品。 原版图纸是英文带水印的&#xff0c;所以实际上课还需要备课。 备课的时候对课程进行了调整&#xff0c;自己制作的5天的暑假班课程&#xff0c;内容比较丰富&#xff0c;…