【白话文通俗易懂搞明白并解决】跨域问题

文章目录

  • 跨域出现的场景
  • 跨域的定义
  • 解决跨域的方法
    • 方法一:JSONP
    • 方法二:添加响应头
    • 方法三:通过nginx代理跨域
  • 跨域过滤器代码示例

跨域出现的场景

在前后端分离项目中,经常会出现跨域问题,表现为:
当在浏览器中访问前端工程的地址时会出现报错,
chrome报错表现如下:

Access to XMLHttpRequest at 'http://localhost:8080/system' from origin 'http://localhost:80' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

firefox报错表现如下:

已拦截跨源请求:同源策略禁止读取位于 http://localhost:8080/system 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。状态码:200

上述报错的原因是前端地址访问后端地址的时候被CORS policy阻止,因为没有Access-Control-Allow-Origin 头信息。

跨域的定义

CORS全称 cross origin resource share 跨域资源共享,浏览器的同源策略是一种安全机制,即判断是否跨域请求,从一个地址请求另一个地址,如果协议、主机、端口三者全部一致则不属于跨域,否则有一个不一致就是跨域请求。例如:
比如:
从http://localhost:80 到 http://localhost:81 由于端口不同,是跨域。
从http://192.168.0.10:80 到 http://192.168.0.11:80 由于主机不同,是跨域。
从http://192.168.0.10:80 到 https://192.168.0.10:80 由于协议不同,是跨域。

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

上述的过程举个简单的例子。你家的门牌号是501,邻居家的门牌号是502。正常情况下你是不能随便去邻居家拜访甚至拿东西的,如果你在没有经过允许的情况下去拿东西,你爸就会把你拽回来不让你去。因为你爸担心邻居可能不安好心,给你灌输一些不好的思想导致你学坏或者套你的话把咱家的银行卡密码泄露出去。这个过程中,你就是项目中的前端工程,你爸就是浏览器,邻居就是服务端,所谓的不好的思想或者套话就是非法网站恶意窃取信息的过程。

解决跨域的方法

解决跨域问题的常见方法:

方法一:JSONP

通过动态添加script标签来实现跨域,因为script标签不受同源策略的限制,可以从任意域加载 JavaScript 代码。但这种方式只能处理GET请求并不能处理POST或其他类型的请求,且容易受恶意服务器的恶意代码注入。

这就相当于你拿个script篮子放到502门口,让邻居把要给的东西放到篮子里你再拿走。

实现步骤:

  • 前端发起一个请求,使用script标签引入目标服务器上的数据资源。
  • 目标服务器将返回的数据包装在一个回调函数中,这样浏览器就可以执行该回调函数,读取数据。
<script>function handleResponse(data) {console.log('Received data:', data);}// 动态创建 <script> 标签var script = document.createElement('script');script.src = 'http://example.com/api/data?callback=handleResponse';document.body.appendChild(script);
</script>

方法二:添加响应头

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

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

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

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

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

Access-Control-Allow-Origin:*

这个过程就相当于邻居打电话跟你说“501,你放心来拿你要的东西吧,我的所有东西都是安全的。”,这时候你爸也不会拦着你去别人家了。
(但上述的过程其实是存在风险的,因为邻居说的话并不一定就是真的,他有可能还是会误导你,这时候就需要一些其他安全机制来保证数据的安全性,比如身份验证、授权检查、内容安全策略、HTTPS加密通信等,所以CORS并不能防止服务器端返回恶意数据)

上述这种方法使用最多,例如在Springboot项目中配置一个过滤器来处理即可,下文会讲到。

方法三:通过nginx代理跨域

由于服务端之间没有跨域,浏览器通过nginx去访问跨域地址。Nginx 在同一个域名下代理请求,将跨域请求转发到其他服务器上。由于请求的源是同一个域,且Nginx作为服务端软件,作用是处理请求和响应,不直接和用户交互,因此不会受到浏览器的同源策略限制

这个过程就像你派一个机器人去邻居家拿东西,它去邻居家拿完东西再回来给你。

在 Nginx 配置文件中设置反向代理,将请求转发到目标服务器即可。
假设前端请求的 URL 是 http://192.168.0.10/api/,我们希望代理到 http://192.168.0.11/api/,可以在 Nginx 配置文件中进行如下配置:

server {listen 80;server_name 192.168.0.10;location /api/ {proxy_pass http://192.168.0.11/api/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}

通过上述配置,当前端请求 http://192.168.0.10/api/data 时,Nginx 会将请求转发到 http://192.168.0.11/api/data。
在这里插入图片描述

跨域过滤器代码示例

对于上述所述的方式二,在SpringBoot项目中,我们通常可以添加配置一个跨域过滤器类用于在响应头上添加允许标志,从而解决这个问题。参考代码如下:

@Configurationpublic class GlobalCorsConfig {/*** 允许跨域调用的过滤器*/@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();//允许白名单域名进行跨域调用config.addAllowedOrigin("*");//允许跨越发送cookieconfig.setAllowCredentials(true);//放行全部原始头信息config.addAllowedHeader("*");//允许所有请求方法跨域调用config.addAllowedMethod("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}}

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

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

相关文章

拟声 0.37.0 | 拟物风格,超级优美,功能丰富

拟声是一款功能丰富的音视频播放器&#xff0c;支持多种音频来源&#xff0c;并具备独特的歌词弹幕、音源转换、跨设备共享与控制等功能。其创新的LRC歌词编解码器和新拟物风格的UI设计为用户提供了一个全新的视听体验。 大小&#xff1a;36M 百度网盘&#xff1a;https://pan…

7.存储过程中的事务管理(7/10)

1.引言 在现代信息技术快速发展的今天&#xff0c;数据库已经成为存储和管理数据的核心工具。无论是企业级应用、电子商务平台还是个人项目&#xff0c;数据库都扮演着不可或缺的角色。在这些应用中&#xff0c;数据的完整性、一致性和可靠性是至关重要的。这就引出了数据库事…

vue3--通用组件 popup 封装

在业务场景中,假设这里我们要实现点击 汉堡 后,会有一个自下而上的popup弹出层 因此这里我们需要先实现这样的一个公共的popup弹出层 那么我们这里的popup弹出层需要具备以下能力: 当popup展开时,内容视图应该不属于任何一个组件内部,而应该直接被插入到body下,这里需要…

【C++11】可变模板参数详解

个人主页&#xff1a;chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中&#xff0c;引入了可变模板参数&#xff08;variadic templates&#xff09;&#xff0c;它为模板编程带来了革命性改变。它的出现允许我们…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-8

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

FlinkCDC 实现 MySQL 数据变更实时同步

文章目录 1、基本介绍2、代码实战2.1、数据源准备2.2、代码实战2.3、数据格式 1、基本介绍 Flink CDC 是 Apache Flink 提供的一个功能强大的组件&#xff0c;用于实时捕获和处理数据库中的数据变更。可以实时地从各种数据库&#xff08;如MySQL、PostgreSQL、Oracle、MongoDB…

【云岚到家】-day07-5-实战项目-优惠券活动-活动管理

【云岚到家】-day07-5-实战项目-优惠券活动-活动管理 2 优惠券活动管理2.1 需求分析2.1.1 **新增优惠券活动**1&#xff09;界面原型2&#xff09;数据分析3&#xff09;数据校验 2.1.2 **查询优惠券活动**1&#xff09;界面原型 2.2.3 **修改优惠券活动**1) 界面原型2&#xf…

Qt-窗口对话框QMessageBox的使用(51)

目录 前言 描述 使用 自定义按钮 简单方式创建 前言 Qt 提供了多种可复⽤的对话框类型&#xff0c;即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常⽤标准对话框如下&#xff1a; 描述 消息对话框 QMessageBox 消息对话框是应⽤程序中最常⽤的界⾯元素。消息…

D3.js(五):实现组织架构图

实现组织架构图 效果初始化组织机构容器并实现缩放平移功能效果源码 渲染节点效果源码 渲染连线效果源码 完整源码 效果 初始化组织机构容器并实现缩放平移功能 效果 源码 import {useEffect} from react; import TreeData from ./json/tree-data.json;interface ITreeConfig…

crd介绍

在 Kubernetes 中&#xff0c;CRD&#xff08;Custom Resource Definition&#xff09;和 CR&#xff08;Custom Resource&#xff09;是用于扩展 Kubernetes 功能的机制。它们的关系和使用可以用一个完整案例来说明。 定义 CRD&#xff08;Custom Resource Definition&#x…

中后台 B 端产品设计

中后台 B 端产品设计 一、设计目标二、设计流程三、设计要点四、相关模块 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 中后台B端产品设计&#xff1a; 是指针对企业内部业务人员和管理…

python+appium+雷电模拟器安卓自动化及踩坑

一、环境安装 环境&#xff1a;window11 1.1 安装Android SDK AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 这里面任选一个就可以&#xff0c;最终下载完主要要安装操作安卓的工具adb&#xff0c;安装这个步骤的前提是要…

Linux驱动开发——设备树

文章目录 1 什么是设备树&#xff1f;2 DTS、DTB和DTC3 DTS语法3.1 dtsi头文件3.2 设备节点3.3 标准属性3.4 根节点compatible属性3.5 向节点追加或修改内容 4 创建小型模板设备树5 设备树在系统中的体现6 绑定信息文档7 设备树常用OF操作函数7.1 查找节点的OF函数7.2 查找父/子…

【工具变量】上市公司当年是否发生财务重述指标整理Stata代码(2000-2023年)

计算说明&#xff1a;使用财务重述公告中所更正年报对应的年度作为财务重述的年度&#xff0c;若企业年报中发生财务重述取1&#xff0c;否则取0。本示例的财务重述是指上市公司对以前年度财务报表中的会计差错进行更正和披露&#xff0c;不包括股票拆分、股票红利、终止经营、…

Java 类和对象详解(上 )

个人主页&#xff1a; 鲤鱼王打挺-CSDN博客 Java专栏&#xff1a;https://blog.csdn.net/2401_83779763/category_12801101.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12801101&sharereferPC&sharesource2401_83779763&sharefromfrom_link &…

SwiftUI 如何取得 @Environment 中 @Observable 对象的绑定?

概述 从 SwiftUI 5.0&#xff08;iOS 17&#xff09;开始&#xff0c;苹果推出了全新的 Observation 框架。它作为下一代内容改变响应者全面参与到数据流和事件流的系统中。 有了 Observation 框架的加持&#xff0c;原本需要多种状态类型的 SwiftUI 视图现在只需要 3 种即可大…

R语言详解predict函数

R语言中predict函数在建立模型&#xff0c;研究关系时常用。但是不同type得到的结果常常被混为一谈&#xff0c;接下来&#xff0c;探讨predict得到的不同结果。 #数据 set.seed(123) n<-1000 age<-rnorm(n,mean50,sd10) gender<-rbinom(n,1,0.5) disease<-rbinom…

CDC变更数据捕捉技术是什么?和ETL有什么不同?

一、什么是CDC技术? 变更数据捕获&#xff08;Change Data Capture&#xff0c;简称 CDC&#xff09;是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理&#xff1a; 1.监测数据源&#xff1a;CDC 工具会持续监测指定的数据源&#xff0c;如数据库表、文件系统…

【踩坑随笔】Tensorflow-GPU训练踩坑

一个无语的坑&#xff0c;4060单卡训练&#xff0c;8G内存本来就不够&#xff0c;还没开始训练就已经爆内存了&#xff0c;但是居然正常跑完了训练&#xff0c;然后一推理发现结果就是一坨。。。往回翻日志才发现原来中间有异常。 首先解决第一个问题&#xff1a;Could not lo…

k8s部署Kafka集群超详细讲解

准备部署环境 Kubernetes集群信息 NAMEVERSIONk8s-masterv1.29.2k8s-node01v1.29.2k8s-node02v1.29.2 Kafka&#xff1a;3.7.1版本&#xff0c;apche版本 Zookeeper&#xff1a;3.6.3版本 准备StorageClass # kubectl get sc NAME PROVISIONER RECLA…