跨域问题的原理及解决方法

一.同源策略

如果没有进行特殊处理,我们在进行前后端联调的时候游览器会发生报错:

这是因为请求被同源策略被阻止,浏览器出于安全的考虑,使用XMLHttpRequest对象发起HTTP请求(异步请求)时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。

那什么是同源策略呢?

同源策略(Same-Origin Policy),是一个web安全的基础原则。

【1】同源

什么是同源呢?指的是协议(如HTTP或HTTPS)、域名和端口号完全相同才算同源。

【2】跨域

从一个地址请求另一个地址,如果协议、主机、端口三者全部一致则不属于跨域(CORS--cross origin resource share 跨域资源共享),否则有一个不一致就是跨域请求,即不同源就是跨域。

【3】同源策略

而跨域的请求如果没对服务端做特殊处理,默认情况下游览器的请求是无法访问成功的。这就是游览器的同源策略。【同源策略要求在浏览器中运行的脚本只能访问和自身来源相同的文档或脚本】

在游览器中进行前后端联调的时候,本地的端口号与游览器中网页的协议一致,主机一致,但是端口号不一致,所以就会请求接口服务失败。这就是违反了同源策略,产生了跨域问题。所以游览器请求本地接口会失败。

注:为什么Postman没有跨域问题呢?因为Postman不是游览器,没有同源策略。

二.跨域请求的原理

在普通的跨域请求中(非简单请求),浏览器会先发送一个 OPTIONS 请求,该请求称为预检请求(preflight request),用来检查是否允许跨域访问。服务器收到预检请求后,根据请求中的头部信息进行判断,并返回相应的响应头,表示是否允许跨域访问。如果服务器返回的响应头中包含了允许跨域的信息(返回Access-Control-Allow-Origin 头信息),浏览器才会发送实际的跨域请求。

如果服务器没有正确设置响应头,或者返回的响应头中不包含允许跨域的信息,浏览器会拦截跨域请求,导致请求失败。

另外,需要注意的是浏览器的同源策略限制只存在于浏览器环境中。只有游览器才有跨域请求,如果在服务器端进行跨域请求,是不受同源策略限制的。

同源策略的作用是防止恶意网站通过在其页面中注入恶意脚本并获取其他来源的数据,防止跨站点脚本攻击(Cross-Site Scripting,XSS)、跨站点请求伪造(Cross-Site Request Forgery,CSRF)等安全问题的发生。

三.解决跨域问题的方法

那我们怎么让跨域请求成功发送呢?

1.JSONP--了解一下

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

2.添加响应头--常用

服务端在响应头添加 Access-Control-Allow-Origin:*,这样浏览器才会发送实际的跨域请求

原理:

实现:

【1】添加@CrossOrigin注解

既可以用在controller层方法上,表示让这个controller层的接口允许跨域,也可以用在controller层的该类中所有接口允许跨域

【2】在springboot中添加跨域配置类

(实现的原理就是在响应头添加Access-Control-Allow-Origin)

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry){//设置允许跨域的路径registry.addMapping("*")//是否允许cookie.allowCredentials(true)//设置允许的请求方式.allowedMethods("GET","POST","DELETE","PUT")//设置允许的header属性.allowedHeaders("*")//跨域允许时间.maxAge(3600);}
}

3.通过nginx代理跨域

简单说以前是直接访问服务器,现在是先访问nginx再由nginx访问服务器。nginx相当于代理,因为nginx不是游览器,所以没有跨域的问题,通过这样子就解决了跨域的问题。

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

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

相关文章

单文件制作工具 v7.0.2.38(20230406) 最新版_一个小巧强大的PECMD/7zSFX单文件制作工具

网盘下载 功能描述 —全新的自解压内核,非现有的7zSFX、WinRAR、ZLIB自解压模块; —采用先进的打包方式(堪称黑科技—>内核默认PECMD自解压模块) —7zSFX模块,创建的单文件支持传递参数(包含内置参数和外…

1、MQ基础

微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于…

信息安全:网络安全审计技术原理与应用.

信息安全:网络安全审计技术原理与应用. 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作。网络安全审计的作用在千建立“事后“安全保障措施,保存网络安全事件及行为信息,为网络安全事件分析提供线…

SQLite 3.43 发布,性能大提升!

前言 SQLite是一种被广泛运用的嵌入式关系型数据库管理系统,最新发布的SQLite 3.43版本带来了一个重要的改进,大幅提升了对JSON数据的处理性能,达到了之前的两倍。 主要更新 添加对 Contentless-Delete FTS5 索引的支持。这是 FTS5 全文搜索…

leetcode算法题-移动零Java

这道题的解法,我们可以新建一个等长的数组,初始化后数组中的元素都为零,我们只需要遍历一遍原来的数组,将不为0的数据转移到新数组即可,下面是代码实现: public static void main(String[] args) {System.out.println("移动零:" Arrays.toString(moveZero(new int[…

【STM32】读写内部Flash初步使用

基于stm32f103,作为个人学习记录使用 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,在紧急状态下常常会使用内部 FLASH 存储关键记录; 内部 FLASH 的构成 STM32 的内部 FLASH 包含主存储器、系统存储器以及选项字节区域 大容量…

Unity下tga和png格式图片打包成AB包大小和加载速度测试

测试素材 测试素材,一张tga格式,一张png格式,他们的图像尺寸一样都是8K图。 两张图在AssetBundles里显示 Tga格式的图明显大很多,我们打包成ab包看看。 在PC 打包后看,明显大小一样,我们进行ab包加载&am…

文心一言 VS 讯飞星火 VS chatgpt (101)-- 算法导论9.3 7题

七、用go语言,设计一个 O(n)时间的算法,对于一个给定的包含n个互异元素的集合 S 和一个正整数k≤n,该算法能够确定 S 中最接近中位数的k个元素。 文心一言: 要设计一个 O(n) 时间的算法来找到集合 S 中最接近中位数的 k 个元素&…

idea创建同级项目-纠结是SB

idea创建同级项目-纠结是SB 创建方法:

从C语言到C++:C++入门知识(1)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关C语言的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

Linux:进程概念的引入和理解

文章目录 进程的初步理解进程的实质理解查看进程 前面对操作系统有了一个基础的认知,从中得出的最重要的一个思想是,在认识一个新事物前要先描述,再组织,有了这样的思想也可以用于学习进程的概念 进程的初步理解 有了前面的思想…

学习路之PHP--lumen安装配置

一、下载lumen源码 composer create-project --prefer-dist laravel/lumen blog 安装lumen-generator composer require flipbox/lumen-generator 二、配置 bootstrap\app.php 97行 $app->register(Flipbox\LumenGenerator\LumenGeneratorServiceProvider::class);三、生成…

VS CODE中的筛选器如何打开?

最近更新了vscode1.82版本,发现在git管理界面有一个“筛选器”功能,十分好用,后来关掉了,找了好久都没有找到办法打开这个筛选器功能,今天无意中不知道按到了哪个快捷键,打开了,就是下图这个&am…

buuctf-[网鼎杯 2020 朱雀组]phpweb

1.打开网站,吓我一跳 2.查看源代码,主要看到timezone,然后这个页面是五秒就会刷新一次 一开始去搜了这个,但是没什么用 3.使用bp抓包 会发现有两个参数,应该是用func来执行p 4.修改func和p file_get_contents&#…

全新UI基于Thinkphp的最新自助打印系统/云打印小程序源码/附教程

这是一款全新的基于Thinkphp的最新自助打印系统,最新UI界面设计的云打印小程序源码,带有简单的教程。 下载地址:https://bbs.csdn.net/topics/617324130

3分钟,免费制作一个炫酷实用的数据可视化大屏!

在当前大数据时代背景下,数据已成为在工业革命中如同煤炭、石油一般宝贵的资源。但是由于数据越来越庞大、越来越复杂,导致数据的可读性也越来越低。因此,对数据可视化的需求也越来越高,需要解决的问题也越来越复杂,而…

进程的内存映像

组成部分 代码段:即程序的二进制代码,只读,可被多个进程共享数据段:包括全局变量和静态变量进程控制块PCB:在系统区(内核区),操作系统通过PCB来控制和管理进程堆:用来存放…

Docker部署ActiveMQ消息中间件

1、准备工作 docker pull webcenter/activemq:5.14.3 Pwd"/data/software/activemq" mkdir ${Pwd}/data -p2、运行容器 docker run -d --name activemq \-p 61616:61616 \-p 8161:8161 \-v ${Pwd}/data:/opt/activemq/data \-v /etc/localtime:/etc/localtime \--r…

4+机器学习+实验验证

今天给同学们分享一篇4机器学习实验验证的生信文章“Identification and Analysis of Neutrophil Extracellular Trap-Related Genes in Osteoarthritis by Bioinformatics and Experimental Verification”,这篇文章于2023年8月31日发表在 J Inflamm Res 期刊上&am…

HTMl案例二:注册页面

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>综合案例-注册页面</title> </head><…