当前位置: 首页 > news >正文

浏览器跨域请求

跨域是浏览器的一种同源策略,所以该概念只存在于通过浏览器访问服务里。

如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同. 比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据 浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险

 

已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:8001/SendAjax/ 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。 但是注意,项目2中的访问已经发生了,说明是浏览器对非同源请求返回的结果做了拦截

1|2CORS(跨域资源共享)简介

 

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。 因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

1|3CORS基本流程

 

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。 浏览器发出CORS简单请求,只需要在头信息之中增加一个Origin字段。 浏览器发出CORS非简单请求,会在正式通信之前,增加一次HTTP查询请求,称为”预检”请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

1|4CORS两种请求详解

只要同时满足以下两大条件,就属于简单请求。

 

(1) 请求方法是以下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出以下几种字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

凡是不同时满足上面两个条件,就属于非简单请求。浏览器对这两种请求的处理,是不一样的

 

* 简单请求和非简单请求的区别? 简单请求:一次请求 非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。 * 关于“预检” - 请求方式:OPTIONS - “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息 - 如何“预检” => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过 Access-Control-Request-Method => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过 Access-Control-Request-Headers

支持跨域,简单请求: 服务器设置响应头:Access-Control-Allow-Origin = ‘域名’ 或 ‘*’ 支持跨域,复杂请求: 由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。 “预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method “预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers

关于'服务端接收到预检请求后,分析CORS请求头中的内容,决定是否允许该请求',这个详细流程和步骤是怎么样的,具体做了哪些检查?

预检请求的目的是为了让服务端知道客户端的跨域请求信息,并决定是否允许这个跨域请求。下面是服务端处理CORS预检请求的详细流程和步骤:

1. 收到CORS预检请求后,服务端首先校验该请求的method是否为OPTIONS,如果不是OPTIONS,则服务端直接返回HTTP错误码 405 Method Not Allowed。

2. 服务端进一步检查CORS请求头中的Origin字段,确认该请求是否来自允许的域名。如果Origin字段不在允许的域名列表中,服务端会直接返回HTTP错误码403 Forbidden。

3. 如果Origin字段在允许的域名列表中,服务端会检查CORS请求头中的Access-Control-Request-Method字段,判断实际请求是否支持该方法。如果服务器端不支持该方法,会直接返回HTTP错误码 405 Method Not Allowed。

4. 如果服务器端支持该方法,继续检查CORS请求头中的Access-Control-Request-Headers字段,确认所有请求头字段是否都被允许。如果有请求头字段没有在服务器端允许的请求头列表中,服务端会拒绝该请求并返回HTTP错误码 403 Forbidden。

5. 如果所有检查都通过了,服务端可以根据配置的跨域策略,通过在响应头中设置Access-Control-Allow-*字段来告诉浏览器可以执行跨域请求。例如,设置Access-Control-Allow-Origin字段为请求头中的Origin值,表示允许该域名跨域访问。

6. 服务端发送响应头信息,告诉浏览器CORS预检请求允许通过。浏览器收到允许的响应头信息后,会发送第二个实际请求,并在请求头中携带CORS相关的信息,服务端接收到这个实际请求后,可以进行正常的数据处理并返回响应数据。

综上所述,服务端在处理CORS预检请求时,需要根据CORS请求头中的Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段,对该跨域请求的域名、方法和请求头信息进行有效性检查,并根据服务端的跨域配置策略,返回恰当的响应头信息来告诉浏览器是否允许该跨域请求。

如果浏览器发送了一个OPTIONS请求,服务端怎么知道是需要校验跨域请求?

当浏览器发送OPTIONS请求时,服务端会检查此请求是否携带了CORS相关的请求头信息。如果携带了跨域请求的请求头信息,则服务端会理解该请求是一次CORS请求,进行进一步的处理。

具体来说,CORS请求头中至少包含了Origin字段,该字段表示请求的源,服务端通过跟自己存储的允许跨域请求的域名列表对比,判断该请求是否允许跨域。

另外,在OPTIONS请求中还会包含Access-Control-Request-Method和Access-Control-Request-Headers两个字段,用于告诉服务端实际请求将使用哪种方法和请求头字段。服务端可以根据这些信息,判断实际请求是否被允许。

如果服务端检查后发现该请求是一次跨域请求,就会根据CORS策略决定是否向浏览器发送响应头信息,告知浏览器是否允许实际请求跨域。如果服务端认为该跨域请求不合法,则会拒绝该请求,不做任何处理或者返回适当的错误信息。

不同的配置CORS的方式:

1.可以通过@Corsorigin注解配置

https://blog.csdn.net/securitit/article/details/113251401

2.可以通过springboot 配置文件里配置,示例如下:

通过配置文件的方式是全局生效,如果想在方法级别控制CORS,就用@Corsorigin注解吧,

这两种方法实现的原理都是通过spring 拦截器实现,大概步骤如下:

/** 在配置文件中很难实现方法级别的跨域请求控制,因为配置文件是全局生效的,无法对单独的方法进行定制。如果你需要实现方法级别的跨域请求控制,可以考虑使用框架提供的注解或拦截器来进行处理。以Spring Boot框架为例,你可以在方法上使用@CrossOrigin注解指定方法允许的跨域请求来源,也可以使用拦截器对特定的方法进行跨域请求控制。以下是使用拦截器实现方法级别跨域请求控制的一个例子:
**/@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new CorsInterceptor()).addPathPatterns("/hello");}
}public class CorsInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;CrossOrigin annotation = handlerMethod.getMethodAnnotation(CrossOrigin.class);if (annotation != null) {String[] allowedOrigins = annotation.origins();String origin = request.getHeader("Origin");if (Arrays.asList(allowedOrigins).contains(origin)) {response.setHeader("Access-Control-Allow-Origin", origin);response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");response.setHeader("Access-Control-Allow-Headers", "content-type");return true;}response.setStatus(HttpServletResponse.SC_FORBIDDEN);return false;}}return true;}
}


这个例子中,我们在添加拦截器的方法上指定了拦截的路径为`/hello`,然后在拦截器的preHandle方法中读取被拦截的方法上的@CrossOrigin注解,判断当前请求的来源是否被允许。如果允许,就设置响应头,否则返回403 Forbidden状态码。这样,我们就可以在方法级别上进行跨域请求的控制了。

相关文章:

浏览器跨域请求

跨域是浏览器的一种同源策略,所以该概念只存在于通过浏览器访问服务里。 如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现 请求的url地址,必须与浏览器上的…...

什么,你还在用 momentJs 处理相对时间

我想&#xff0c;下面这段代码&#xff0c;你是不是在开发中常常这样使用来计算距离现在过去了多长时间&#xff1a; import moment from moment // 61k (gzipped:19.k) function Relative(props) {const timeString moment(props.date).fromNow()return <>{timeString…...

三维模型 工程图

飞机 Crankshaft飞机发动机手动冲压机包装成型机械-充填机械设备10数控等离子切割机床铜线缠绕机机床-磨床08机床-磨床04(附工程图)机床-车床数字纤维缠绕机机械臂液压钳机床-车床06挤出机机械手-09机械手模型库六柴油发动机中央空调机柜空调机机床-钻床三维设计电脑服务器机箱…...

我用ChatGPT写2023高考语文作文(二):全国乙卷

2023年 全国乙卷 适用地区&#xff1a;河南、江西、甘肃、青海、内蒙古、宁夏、新疆、陕西 吹灭别人的灯&#xff0c;并不会让自己更加光明&#xff1b;阻挡别人的路&#xff0c;也不会让自己行得更远。 “一花独放不是春&#xff0c;百花齐放春满园。”如果世界上只有一种花朵…...

java版本工程项目管理系统平台源码,助力工程企业实现数字化管理

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…...

代码随想录第55天

1.判断子序列&#xff1a; 动态规划五部曲分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。 注意这里是判断s是否…...

算法设计与分析(填空专题)

文章目录 填空题填空题 设有一稀疏图 G,则 G 采用 邻接表 存储较省空间。 算法的时间复杂性是指算法中 元运算 执行次数。 分治法的基本思想是将一个规模为 n 的问题分解为与原问题 相同 的 k 个规模较小且互相独立的子问题。 贪心算法中每次做出的贪心选择都是 当前的 最优选…...

Ubuntu22.04 K8s1.27.2

Ubuntu22.04 && K8s1.27.2 1. 服务器配置 IpServerMEM192.168.56.11k8smaster6G192.168.56.16k8snode14G192.168.56.17k8snode24G 2. 获取源 $ sudo apt-get update $ sudo apt-get install -y apt-transport-https ca-certificates curl# packages.cloud.google.c…...

卡尔曼滤波与组合导航原理(十二)扩展卡尔曼滤波:EKF、二阶EKF、迭代EKF

文章目录 一、多元向量的泰勒级数展开二、扩展Kalman滤波三、二阶滤波四、迭代EKF滤波 一、多元向量的泰勒级数展开 { y 1 f 1 ( X ) f 1 ( x 1 , x 2 , ⋯ x n ) y 2 f 2 ( X ) f 2 ( x 1 , x 2 , ⋯ x n ) ⋮ y m f m ( X ) f m ( x 1 , x 2 , ⋯ x n ) \left\{\begin{…...

基于蒙特卡洛模拟法的电动汽车充电负荷研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

自学黑客【网络安全】,一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…...

编程中的心理策略:如何从错误中学习并实现自我成长

在日复一日的工作中&#xff0c;我们免不了会产生一些失误&#xff0c;会因此感到沮丧和失望。但如何正确地对待和处理这些失误才是最重要的&#xff0c;它直接影响到我们的工作表现和个人成长。 一、面对失误而带来的指责和沮丧的策略 在程序设计领域&#xff0c;我们经常面临…...

Rocket面试(五)Rocketmq发生流量控制的情况有哪些?

在使用rocketmq过程中总能看见一下异常 [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 206ms, size of queue: 5这是因为Rocketmq出发了流量控制。 触发流量控制就是为了防止Broker压力过大挂掉。主要分为Broker流控&#xff0c;Consu…...

Tableau招聘信息数据可视化

获取的招聘信息数据为某招聘网站发布的大数据及数据分析相关岗位&#xff0c;对其他计算机相关岗位的招聘信息数据分析也有一定的参考价值。因为所获取的招聘信息数据数量只有1万左右&#xff0c;实际的招聘信息数量肯定不止1万&#xff0c;所以可能会与实际信息有一定的误差。…...

游戏服务器开发指南(八):合理应对异常

大家好&#xff01;我是长三月&#xff0c;一位在游戏行业工作多年的老程序员&#xff0c;专注于分享服务器开发相关的文章。 本文是通用程序设计主题下的第二篇。这个主题主要探讨如何编写高效、健壮、易读的游戏业务代码&#xff0c;每篇从一个小点切入。本次讨论的要点是&a…...

【g】聚类算法之K-means算法

聚类算法是一种无监督学习方法&#xff0c;它将相似的数据样本划分为一组&#xff0c;同时将不相似的数据样本划分为另一组。这个过程由计算机自动完成&#xff0c;不需要任何人为的干预。 K-means算法是一种经典的聚类算法&#xff0c;它的主要思想是把数据集分成k个簇&#…...

scala内建控制结构

一、条件表达式 &#xff08;一&#xff09;语法格式 - if (条件) 值1 else 值2&#xff08;二&#xff09;执行情况 条件为真&#xff0c;结果是值1&#xff1b;条件为假&#xff0c;结果是值2。如果if和else的返回结果同为某种类型&#xff0c;那么条件表达式结果也是那种类…...

Linux SSH命令实战教程,提升你的服务器管理基本功!

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是专栏【linux基本功-基础命令实战】的第62篇文章。 专栏地址&#xff1a;[linux基本功-基础命令专栏] &#xff0c; 此专栏是沐风晓月对Linux常用命令的汇总&#xff0c;希望能够加深自己的印象&am…...

【Python】Python进阶系列教程-- Python3 CGI编程(二)

文章目录 前言什么是CGI网页浏览CGI架构图Web服务器支持及配置第一个CGI程序HTTP头部CGI环境变量GET和POST方法使用GET方法传输数据简单的表单实例&#xff1a;GET方法使用POST方法传递数据通过CGI程序传递checkbox数据通过CGI程序传递Radio数据通过CGI程序传递 Textarea 数据通…...

do..while、while、for循环反汇编剖析

1、循环语句重要特征提取 循环语句最重要的特点就是执行的过程中会往上跳&#xff01;&#xff01;&#xff01; 箭头往上跳的一般都是循环语句&#xff0c;比如下面的for循环&#xff1a; 2、do..while语句反汇编 #include<iostream> using namespace std; #pragma …...

【代码随想录】刷题Day53

1.最长公共子序列 1143. 最长公共子序列 和之前的一道题目的区别就是这个子序列不需要每个字符相邻。那么条件就变成两种了&#xff0c;一种是当前的字符相同&#xff0c;一种是不同。相同跟之前的条件一样&#xff1b;不同则需要继承上次比较的较大值。if (text1[i - 1] tex…...

MySQL 索引及查询优化总结

一个简单的对比测试 前面的案例中&#xff0c;c2c_zwdb.t_file_count表只有一个自增id&#xff0c;FFileName字段未加索引的sql执行情况如下&#xff1a; 在上图中&#xff0c;typeall&#xff0c;keynull&#xff0c;rows33777。该sql未使用索引&#xff0c;是一个效率非常低…...

什么是AJAX?

AJAX是一种基于Web的技术&#xff0c;它允许Web应用程序在不刷新整个页面的情况下与服务器进行交互。通过AJAX&#xff0c;Web应用程序可以使用JavaScript向服务器发送异步请求并在不干扰用户的情况下更新页面的部分内容。 AJAX是Asynchronous JavaScript and XML的缩写。尽管…...

报表生成器FastReport .Net用户指南:显示数据列、HTML标签

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…...

bootstrap-dialog弹框,去掉遮盖层,可移动

1.去掉遮盖层的设置data-backdrop"false" <div class"modal fade" id"modal" aria-modal"true" role"dialog" data-backdrop"false" style"width:50%"><div class"modal-dialog modal-l…...

7. user-Agent破解反爬机制

文章目录 1. 为什么要设置反爬机制2. 服务器如何区分浏览器访问和爬虫访问3. 反爬虫机制4. User-Agent是什么5. 如何查询网页的User-Agent6. user-agent信息解析7. 爬虫程序user-agent和浏览器user-agent的区别8. 代码查看爬虫程序的user-agent9. 在代码中加入请求头信息 1. 为…...

3.Nginx+Tomcat负载均衡和动静分离群集

文章目录 NginxTomcat负载均衡和动静分离群集Nginx作用实验七层反向代理nginx动静分离四层反向代理负载均衡 NginxTomcat负载均衡和动静分离群集 Nginx是-款非常优秀的HTTP服务器软件 支持高达50 000个并发连接数的响应拥有强大的静态资源处理能力运行稳定内存、CPU等系统资源…...

数据结构与算法之树结构

目录 为什么要使用树结构树结构基本概念树的种类树的存储与表示常见的一些树的应用场景为什么要使用树结构 线性结构中不论是数组还是链表,他们都存在着诟病;比如查找某个数必须从头开始查,消耗较多的时间。使用树结构,在插入和查找的性能上相对都会比线性结构要好 树结构…...

【python】 用来将对象持久化的 pickle 模块

pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了&#xff0c;就是它能够实现任意对象与二进制直接的相互转化&#xff0c;也可以实现对象与文本之间的相互转化。 比如&#xff0c;我程序里有一个 python 对象&#xff0c;我想把它存到磁盘里&#xff…...

【博客654】prometheus配置抓取保护以防止压力过载

prometheus抓取保护配置以防止压力过载 场景 担心您的应用程序指标可能突然激增&#xff0c;以及指标突然激增导致prometheus压力过载 就像生活中的许多事情一样&#xff0c;标签要有节制。当带有用户 ID 或电子邮件地址的标签被添加到指标时&#xff0c;虽然它不太可能结束…...

公司网站制作方案/网站seo诊断报告

科技发展迅速&#xff0c;互联网行业不断壮大&#xff0c;随之软件产品层出不穷&#xff0c;如何保证产品质量&#xff0c;成为非常重要的事情&#xff0c;当下软件功能很复杂&#xff0c;测试工作量庞大&#xff0c;除了使用手工测试来验证功能以外&#xff0c;需要通过对大量…...

wordpress 如何修改主题宽度/阐述网络营销策略的内容

解析&#xff1a;〈#ffffffff〉 #ffffffff由#加八位数字或字母组成&#xff0c;前两个ff为透明度&#xff08;十六进制&#xff09;&#xff0c;后面六位ffffff为颜色代码&#xff0c;采用RGB配色&#xff08;十六进制&#xff09; 需要修改的机油一般都要查找相关资料&#xf…...

wordpress标签多重筛选/简述企业网站推广的一般策略

一、虚拟局域网(VLAN) 当前在我们构造企业网络时所采用的主干网络技术一般都是基于交换和虚拟网络的。交换技术将共享介质改为独占介质,大大提高网络速度。虚拟网络技术打破了地 理环境的制约,在不改动网络物理连接的情况下可以任意将工作站在工作组或子网之间移动,工作站组成逻…...

淘宝网站如何做虚拟/网络营销网站设计

1&#xff1a;打开并登录敬业签&#xff0c;选择一个便签分类&#xff0c;长按底部的。 2&#xff1a;启动输入框之后&#xff0c;输入小习惯文本描述&#xff0c;然后点击左下角闹钟图标。 3&#xff1a;在“时间提醒”页面&#xff0c;设置提醒日期和时间。 4&#xff1a;在重…...

外贸哪些免费网站开发客户/注册公司网上申请入口

background-image 属性是 CSS 的一个用于为元素设置背景图片的属性。语法如下&#xff1a; background-image: url(image.jpg);其中 url(image.jpg) 就是指定图片的地址。可以使用相对路径或绝对路径&#xff0c;也可以使用其他图片引用方式&#xff0c;如 data URI。 使用 bac…...

外包建设网站服务/百度搜索引擎平台

;如果需要这个软件的代码逻辑,删除敏感信息只需要把上面3行代码删除即可.!1:: ;login经过测试必须用ie浏览器&#xff0c;在默认软件里面浏览器设置成ie即可&#xff0c;其他浏览器不让send密码 ;虽然通过程序把银行账号密码写入了,但是只知道账号密码还是只能查询账单,没有u盾…...