如何解决跨域问题?

一,什么是跨域

域(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会将请求转发到目标域,然后将目标域的响应返回给客户端。客户端浏览器认为请求是从同源发起的,因为请求的域与客户端页面的域一致,从而避免了跨域问题。

 

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

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

相关文章

2023华数杯数学建模A题思路 - 隔热材料的结构优化控制研究

# 1 赛题 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等 高科技领域中有着广泛的应用。 目前&#xff0c;由单根隔热材料 A 纤维编织成的织物&#xff0c;其热导率可以直接测出&#xff1b;但是 单根隔热…

工作日报怎么写?聪明灵犀工具能帮你

工作日报怎么写&#xff1f;在工作中每天写日报是必不可少的&#xff0c;日报不仅可以记录每天的工作内容&#xff0c;也可以帮助自己更好的规划下一步的工作任务。但是&#xff0c;如何写出一份好的日报呢&#xff1f;今天我们就来介绍一些工具&#xff0c;让你的写日报更加高…

vscode 第一个文件夹在上一层文件夹同行,怎么处理

我的是这样的 打开终端特别麻烦 解决方法就是 打开vscode里边的首选项 进入设置 把Compact Folders下边对勾给勾掉

核心交换机新增了一个网段,现在下面PC可以获取地址访问内网 ,访问外网说DNS有问题不通

环境: SANGFOR AF 8.0.75 SANGFOR AC 13.0.47 H3C S6520-26Q-SI 问题描述: 1.在核心交换机上新规划了一个网段192.168.200.0/24,现在下面PC可以正常获取IP地址和DNS,正常访问内网服务和其它地址段IP ,访问外网说DNS有问题不通打不开网页 2.DNS解析失败,ping dns服务…

深入理解缓存 TLB 原理

今天分享一篇TLB的好文章&#xff0c;希望大家夯实基本功&#xff0c;让我们一起深入理解计算机系统。 TLB 是 translation lookaside buffer 的简称。首先&#xff0c;我们知道 MMU 的作用是把虚拟地址转换成物理地址。 MMU工作原理 虚拟地址和物理地址的映射关系存储在页表…

无人机电力巡检方案在电网安全与维护中的应用

目前&#xff0c;无人机技术已经在各行各业都有广泛的应用&#xff0c;其中之一就是在电力巡检中的应用。无人机电力巡检方案以其高效、安全、精准的特点&#xff0c;为电网安全与维护带来了重大突破和进步。 一、无人机电力巡检方案是高效巡检的利器 传统的电力巡检方式需要人…

测试|Junit相关内容

测试|Junit相关内容 文章目录 测试|Junit相关内容0.Junit说明1.Junit注解TestDisabledBeforeAll和AfterAllBeforeEach和AfterEach 2.Junit参数化单参数多参数&#xff08;多种/多组&#xff09;CSV获取参数&#xff08;支持多种&#xff09;CSV文件获取参数&#xff08;支持多种…

概率论与数理统计复习总结2

概率论与数理统计复习总结&#xff0c;仅供笔者复习使用&#xff0c;参考教材&#xff1a; 《概率论与数理统计》/ 荣腾中主编. — 第 2 版. 高等教育出版社《2024高途考研数学——概率基础精讲》王喆 概率论与数理统计实际上是两个互补的分支&#xff1a;概率论 在 已知随机…

linux(一)-----osi七层模型

1.七层模型的定义 1&#xff09;物理层 &#xff08;指的是网卡&#xff0c;网线等物理层面的硬件&#xff09; 2&#xff09;数据链路层 前两层可以概括为物理链路层&#xff0c;以二进制的数据形式在物理媒介上进行传输数据&#xff08;传输协议ISO2100协议&#xff09; …

LeetCode[1302]层数最深叶子节点的和

难度&#xff1a;Medium 题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;请你返回 层数最深的叶子节点的和 。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出&#xff1a;15示例 2&#xff1a; 输入&#xff1a;r…

python爬虫 获取简单的get请求

打印结果&#xff1a; 原博主写的很厉害额&#xff0c;写的比较全面&#xff0c;大家可以去学习看看 参考原文&#xff1a; Python调用get或post请求外部接口_python调用post接口_纯洁的小魔鬼的博客-CSDN博客

【TypeScript】TS入门及基础学习(一)

【TypeScript】TS入门及基础学习&#xff08;一&#xff09; 【TypeScript】TS入门及基础学习&#xff08;一&#xff09;一、前言二、基本概念1.强类型语言和弱类型语言2.动态语言和静态语言 三、TypeScript与JavaScript的区别四、环境搭建及演练准备4.1 安装到本地4.2 在线运…

计算机视觉与图形学-神经渲染专题-第一个基于NeRF的自动驾驶仿真平台

如今&#xff0c;自动驾驶汽车可以在普通情况下平稳行驶&#xff0c;人们普遍认识到&#xff0c;真实的传感器模拟将在通过模拟解决剩余的极端情况方面发挥关键作用。为此&#xff0c;我们提出了一种基于神经辐射场&#xff08;NeRF&#xff09;的自动驾驶模拟器。与现有作品相…

【爬虫实践】使用Python从网站抓取数据

一、说明 本周我不得不为客户抓取一个网站。我意识到我做得如此自然和迅速&#xff0c;分享它会很有用&#xff0c;这样你也可以掌握这门艺术。【免责声明&#xff1a;本文展示了我的抓取做法&#xff0c;如果您有更多相关做法请在评论中分享】 二、计划策略 2.1 策划 确定您…

软件测试(功能、接口、性能、自动化)详解

一、软件测试功能测试 测试用例编写是软件测试的基本技能&#xff1b;也有很多人认为测试用例是软件测试的核心&#xff1b;软件测试中最重要的是设计和生成有效的测试用例&#xff1b;测试用例是测试工作的指导&#xff0c;是软件测试的必须遵守的准则。 黑盒测试常见测试用…

idea运行web老项目

idea打开老项目 首先你要用idea打开老项目&#xff0c;这里看我之前发的文章就可以啦 运行web项目 1. 编辑配置 2. 添加tomcat项目 3. 设置tomcat参数 选择本地tomcat&#xff0c;注意有的tomcat版本&#xff0c;不然运行不了设置-Dfile.encodingUTF-8 启动&#xff0c;这样…

vue3实现拖拽排序

效果&#xff1a; 实现 <template><div class"box"><divv-for"(item, index) in items":key"item.id"class"item":style"{ order: item.order }":draggable"true"dragstart"onDragStart(in…

【测试联调】如何在前后端测试联调时优雅的构造异常场景

目录 背景 使用iptables实现 利用iptables丢弃某ip数据包 使用 -L 列出所有规则 IP 连通性 通信 测试 插入一条规则&#xff0c;丢弃此ip 的所有协议请求 列出所有规则 测试 丢弃规则内的IP 连通性 清除 规则列表的 限制 模拟ip进行丢包50%的处理。 mysql proxy 代理…

脑电信号处理与特征提取——6.运用机器学习技术和脑电进行大脑解码(涂毅恒)

目录 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分析 6.4 代码解读 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分…

快速增加Shopee,lazada店铺销量的秘籍大揭秘

在竞争激烈的电商市场中&#xff0c;如何快速提高Shopee。lazada店铺的销量一直是卖家们关注的焦点。 优化产品信息&#xff1a;在Shopee平台上&#xff0c;完整填写产品标题、描述和关键词等信息非常重要。确保您的产品信息准确、清晰&#xff0c;并包含与目标买家搜索相关的…