如何解决跨域问题?

news2024/11/17 17:30:41

一,什么是跨域

域(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.coloradmin.cn/o/831619.html

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

相关文章

机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归)

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归)&#xff0c;这几天引爆网络的科技大新闻就是韩国科研团队宣称发现了室温超导材料-LK-99&#xff0c;这种材料…

读MetaGait代码

前置问题 关于分布式&#xff0c;可能是系统、网络等问题我最终还是取消掉了&#xff0c;下面这些尝试使用分布式时报的错姑且记录一下。。。 ############################## module ‘distutils’ has no attribute ‘version’ pip install setuptools59.5.0 No module …

数智保险 创新未来 | GBASE南大通用亮相中国保险科技应用高峰论坛

本届峰会以“数智保险 创新未来”为主题&#xff0c;GBASE南大通用携新一代创新数据库产品及金融信创解决方案精彩亮相&#xff0c;与国内八百多位保险公司高管和众多保险科技公司技术专家&#xff0c;就保险领域数字化的创新应用及生态建设、新一代技术突破及发展机遇、前沿科…

算法通关村—括号匹配问题解析

1. 有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。…

网易云音乐扫码登录

简介 尚硅谷的网易云音乐项目无法登录&#xff0c;因为目前网易修改了接口使用手机号和密码登录的话需要先通过认证才可以&#xff0c;所以目前无法使用手机号登录&#xff0c;只能使用二维码登录&#xff0c;接下来我就教大家如何使用 二维码进行登录 实现步骤 1.获取nodejs接…

【Spring Cloud 四】Ribbon负载均衡

Ribbon负载均衡 系列文章目录背景一、什么是Ribbon二、为什么要有Ribbon三、使用Ribbon进行负载均衡服务提供者A代码pom文件yml配置文件启动类controller 服务提供者Bpom文件yml配置文件启动类controller 服务消费者pom文件yml文件启动类controller 运行测试 四、Ribbon的负载均…

Kubespray-offline v2.21.0-1 下载 Kubespray v2.22.1 离线部署 kubernetes v1.25.6

文章目录 1. 目标2. 预备条件3. vcenter 创建虚拟机4. 系统初始化4.1 配置网卡4.2 配置主机名4.3 内核参数 5. 打快照6. 安装 git7. 配置科学8. 安装 docker9. 下载介质9.1 下载安装 docker 介质9.2 下载 kubespray-offline-ansible 介质9.3 下载 kubernetes 介质 10. 搬运介质…

css, resize 拖拉宽度

效果如下&#xff1a; 可直接复制预览查看属性值: 关键样式属性&#xff1a; resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

睿讯微带你深度了解汽车交流充电桩

这几年随着新能源汽车的普及&#xff0c;充电桩也越来越多的出现在我们的视野中。新能源纯电汽车就好比一种大号的电子产品&#xff0c;而充电桩则是它不可缺少的子系统&#xff0c;是新能源车主们的必要选择。 汽车充电桩分为直流和交流两种&#xff0c;2022年底全国公共充电桩…

华为防火墙会话表

会话表是设备转发报文的关键表项。所以当出现业务故障时&#xff0c;通常可以通过查看会话表信息&#xff0c;大致定位发生故障的模块或阶段。 当某个业务发生问题&#xff0c;例如流量不通或者断断续续时&#xff0c;通过查看会话表可以得出以下信息&#xff1a; 如果该项业…

Android 死机问题学习笔记

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、死机系统简图二、死机的可能原因三、死机问题需要分析哪些数据四 、Java Backtrace 分析五、常见 Java backtrace 举例六、Native Backtrace七、Ke…

单月涨粉90w,小红书科普视频引发高关注

为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出7月月度榜单&#xff0c;从创作者、品牌、品类多方面入手&#xff0c;解析月榜数据&#xff0c;为从业者提供参考。 爆款笔记涨粉90w 科普视频引发高关注 据7月的『涨粉排行榜』TOP500数据显示&#xff0c;头…

在线LaTeX公式编辑器编辑公式

在线LaTeX公式编辑器编辑公式 在编辑LaTex文档时候&#xff0c;需要输入公式&#xff0c;可以使用在线LaTeX公式编辑器编辑公式&#xff0c;其链接为: 在线LaTeX公式编辑器&#xff0c;https://www.latexlive.com/home 图1 在线LaTeX公式编辑器界面 图2 在线LaTeX公式编辑器…

IDEA用Gradle构建项目时,lombok插件无效的解决办法

Lombok 可用来帮助开发人员消除 Java 的重复代码&#xff0c;尤其是对于简单的 Java 对象&#xff08;POJO&#xff09;&#xff0c;比如说getter/setter/toString等方法的编写。它通过注解实现这一目的。 正确使用姿势 一、安装Lombok插件 菜单栏File -> Settings ->…

C++继承——多继承导致的菱形继承

目录 单继承&#xff1a; 多继承&#xff1a; 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况。 三.菱形继承的两种解决方式区别&#xff1a; 3.1采用作用域解决的菱形继承&#xff1a; 检测器运行图&#xff1a; 反汇编运行图&#xff1a; 3.1菱形虚继承&…

私募证券基金动态-23年7月报

成交量&#xff1a;7月日均8,481.84亿元 2023年7月A股两市日均成交8,481.84亿元&#xff0c;环比下降11.78%、同比下降15.77%。7月整体21个交易日&#xff0c;仅有月初第1个交易日单日成交金额过万亿&#xff0c;且成交量起伏较大&#xff0c;单日成交金额最低仅有6610.11亿元…

深度学习(32)——CycleGAN(1)

深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09; 文章目录 深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09;1. GAN原理2. CycleGAN&#xff08;1&#xff09;原理&#xff08;2&#xff09;核心思想&#xff08;3&#xf…

双环抱式“星环“座舱设计:比亚迪仰望U8内饰曝光,搭载骁龙8+车机

根据8月3日的消息&#xff0c;比亚迪车机先前使用的高通骁龙625芯片在网友中引发了一些批评&#xff0c;不过随着比亚迪将车机升级为骁龙665、骁龙690/695&#xff0c;这个问题得到了改善。 与此同时&#xff0c;大多数主流车企还在继续使用高通8155芯片&#xff08;相当于骁龙…

【Kubernetes】

目录 一、Kubernetes 概述1、K8S 是什么&#xff1f;2、为什么要用 K8S?3、Kubernetes 集群架构与组件 二、核心组件1、Master 组件2、Node 组件3、K8S创建Pod的工作流程&#xff1f;&#xff08;重点&#xff09;4、K8S资源对象&#xff08;重点&#xff09;5、Kubernetes 核…

基于Dockerfile构建镜像应用

目录 一、镜像概述 二、镜像构建方式 三、镜像构建案例 3.1、基于已有容器创建镜像 3.2、基于本地模板创建镜像 3.3、基于Dockerfile构建镜像 3.3.1、Docker 镜像结构 3.3.2、Dockerfile介绍 3.3.3、Dockerfile详解 3.3.4、Dockerfile构建SSHD镜像 3.3.5、Dockerfile…