总在发OPTIONS请求?这次终于搞懂CORS预检了

OPTIONS请求(跨域预检查) 阅读详情

01 引言

作为一名开发者,你是否经常在浏览器的 Network 面板里,看到一个神秘的 OPTIONS 请求总是抢在你真正的 API 请求之前?它来去匆匆,有时成功,有时失败,留下一个让人头疼的 CORS 错误便扬长而去。

你是否曾对此感到困惑:“这个多余的请求到底是谁发的?为什么要有它?我该怎么让它消失?” 别担心,你并不是一个人。这个看似多余的“预请求”(Preflight Request),其实是浏览器保护我们应用安全的关键“守门员”。

本文将带你彻底揭开 OPTIONS 请求的神秘面纱,从它的诞生原因到完美解决方案,让你不仅知其然,更知其所以然,从此轻松搞定跨域难题!

02 产生的原因

预请求OPTIONS的产生源于浏览器的同源策略,这是浏览器最基本的安全功能。同源策略限制了不同源之间的资源交互,防止恶意网站窃取数据。

然而,现代Web应用需要与不同域的API进行通信,这就产生了矛盾。尤其现在已经进入了移动时代,前后端分离是无法避开这样的问题:跨域。CORS机制应运而生,在安全和功能之间取得平衡,也是解决跨域问题的关键技术。

跨域的前提下,并非所有请求都会触发预检。满足以下所有条件的请求属于 简单请求,不会触发预检:

  • 方法为:GET、HEAD、POST
  • 头信息仅包含:Accept, Accept-Language, Content-Language, Content-Type(值仅限于 application/x-www-form-urlencoded, multipart/form-data, text/plain)
  • 请求中的任何 XMLHttpRequestUpload 对象均没有注册任何事件监听器。

反之,都称为复杂请求,如:

  • 使用了非简单方法:PUT、DELETE、PATCH 等。
  • 自定义请求头:如Authorization、X-token等
  • Content-Type 超出简单范围:application/json

这时,浏览器就会主动发起预请求 OPTIONS,以确保服务器理解和允许接下来的正式请求,从而保护服务器免受非法的跨域请求。

对于前端开发者而言,OPTIONS 请求是由浏览器自动处理的,无需编写额外代码。对于后端来说,预请求也不需要单独去编写方法,但是需要在CorsFilter中正确处理OPTIONS方法。

03 跨域的解决方案

跨域可以再网关层解决,如Nginx,也可以从服务端解决。我们从服务端的角度介绍几种方案。我们先用浏览器的一个HTML和服务模拟跨域请求。

通过自定义请求头,模拟复杂请求,触发预请求。

3.1 @CrossOrigin注解

这种方式是细粒度的控制每一个方法。

3.2 SpringBoot配置

这里要说的就是allowedOrigins和allowedOriginPatterns的区别。测试的时候发现配置allowedOrigins("*")是不生效的。

  • allowedOrigins:只能配置固定的请求源,不能使用通配符
  • allowedOriginPatterns:就是allowedOrigins扩展,可以使用通配符,可以动态控制允许的源。

3.3 CorsFilter

全限定类名:org.springframework.web.filter.CorsFilter

配置基本一致,其中CorsConfiguration.ALL就是*。

3.4 自定义过滤器

配置

@Bean
public FilterRegistrationBean apiFilter() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(new ApiFilter());
    registrationBean.addUrlPatterns("/*");
    return registrationBean;
}

之前介绍的三种,预请求基本不会有问题,就算有问题也不好解决。自定义的跨域拦截器更加灵活。如果里面的尤其的业务逻辑,如果出现异常,就是导致预请求失败。这时我们需要特殊处理。增加如下的代码:

String method = request.getMethod();
if (StringUtils.equalsIgnoreCase(method, "OPTIONS")) {
    response.setStatus(204);
    return;
}

表示只要是与请求,直接响应2xx,预请求就会通过。204表示响应成功,但是没有任何内容。

04 小结

总而言之,那个总是在你“非简单请求”前抢先一步的 OPTIONS 请求,并非多此一举,而是浏览器恪尽职守、严格执行安全策略的表现。

为了减少此类请求带来的资源消耗,我们可以通过设置Access-Control-Max-Age或者maxAge来控制指定时间段内读取缓存。

案例里面为了方便,放行了所有的请求方法、源以及请求头。在实际生产中为了安全,我们可以按需信任并放行指定的资源。

下次再在 Network 里看到它,你大可以会心一笑,因为你已经透彻理解了它背后的安全逻辑,并能轻松地驾驭它。从此,CORS 预检不再是拦路虎,而是你Web开发知识体系里一个牢固的组成部分。

什么时候会发送options请求(预检请求) OPTIONS请求即预检请求,可用于检测服务器允许的http方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起OPTIONS请求,即CORS预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。 总结触发option条件: 前提是发生跨域请求 触发一定条件,例如post请求的content-type为application/json 一. 偶然的相遇——options请求 最近写的项目,应用里所有的ajax请求都发送了2遍。由于新项目,基础模块是新搭的,所以出现一 阅读详情

相关推荐

Crossbar RRAM技术解析:从1TnR架构到存储革命

非易失性存储器(NVM)是数据存储的核心技术,其原理基于物理状态的稳定改变以实现数据持久化。阻变存储器(RRAM)作为一种新兴NVM,利用导电细丝在介质层中的形成与断裂实现数据存储,具有高速、低功耗和结构简单的优势。在工程实践中,RRAM面临潜行路径电流等挑战,而Crossbar提出的1TnR架构通过引入共享晶体管有效解决了这一问题,在保证性能的同时提升了集成密度。该技术与CMOS工艺兼容,支持后端集成与多层堆叠,为高密度存储和嵌入式应用提供了新的解决方案。结合当前行业对高能效、高密度存储的需求,RRAM在

weixin_42523104的博客 322

【HTTP】如何避免OPTIONS请求?

场景:在调用后端接口的时候会出现两次请求:OPTIONS请求和GET请求。OPTIONS请求耗费了一定的时间,需减少OPTIONS请求。 查找原因是浏览器对简单跨域请求和复杂跨域请求的处理区别。 XMLHttpRequest会遵守同源策略(same-origin policy). 也即脚本只能访问相同协议/相同主机名/相同端口的资源, 如果要突破这个限制, 那就是所谓的跨域, 此时需要遵守...

smart_dream 3万+

Abaqus滞回问题求解—浆锚连接装配式剪力墙滞回模拟

当下土木工程研究生,多数都在从事装配式混凝土构件安全或装配式混凝土构件连接节点力学性能的研究。研究这类问题,几乎脱离不开对有限元软件的使用,Abaqus求解能力非常强大,但模型处理能力相对较弱。装配式混凝土结构的有限元计算与传统现浇结构相比,其节点处理起来相对复杂,计算结果往往需要凸显出连接节点力学特性,所以对建模精程度的要求较高。所以向大家介绍一款工具—HyperMesh软件(一下简称Hm),它是专业的有限元前处理工具,用于处理装配式混凝土构件或连接节点有限元模型比较合适。这篇文章主要介绍如何利用Hm处理

qq_31918049的博客 2904

options请求(跨域预检)

options 请求就是预检请求,可用于检测服务器允许的 http 方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起 OPTIONS 请求,即 CORS 预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。...

weixin_45943355的博客 3万+

EtherCAT FOE从站开发实战:SSC工具包实现固件在线升级与文件传输

EtherCAT从站开发中,固件在线升级与文件传输是常见需求。FOE(File Access over EtherCAT)作为邮箱通信协议,在实时总线上提供可靠的文件读写通道,与PDO、DC同步共存。其原理基于SM邮箱和状态机,通过SSC工具包可快速启用。技术价值在于无需拆机即可更新固件、导出日志,提升产线效率。应用场景包括伺服驱动器、IO模块等从站的固件升级与参数配置。本文深入讲解从站侧FOE读写实现、主站调用及工程化建议,助力嵌入式工程师高效开发。

weixin_29169899的博客 129

Android客户端如何设计架构

当我们在新开发一款APP时,我们在初期要如何设计架构呢?在这里我根据我的经验,总结了一些基本的架构思路。 客户端架构设计的时候,首先需要充分考虑到所开发的app的类型,这里我分为功能型和服务型两大类,功能型的app侧重业务和功能,服务型的app侧重服务和运算。下面我就具体来讲讲针对这两种类型的通用架构。 功能型app 功能型app的activity比较多,整个app都以一个个activity承载业务和功能,在设计这类app时,我们需要考虑哪些要素呢? 由于activity比较多,我们需要考虑页面的跳转路由,

子者不语的专栏 1544

Google Chrome 如何屏蔽 OPTIONS 请求?

了解了 `OPTIONS` 是预请求之后该如何屏蔽 OPTIONS 请求呢?答案很简单,只需要在 `Filter` 中输入 `-method:OPTIONS` 即可!

极客点儿 3349

F5 Shape盾JSVMP核心检测点与无限并发Header生成实战(TikTok/航司)

本文深入剖析了F5 Shape盾结合JSVMP技术的核心风控机制,详细解读了其针对浏览器指纹、行为时序等多维度的检测逻辑。通过实战案例,分享了如何通过逆向分析、精准Hook关键检测点,并构建稳定、高并发的请求Header生成方案,以应对TikTok、航司等平台的高级反爬挑战。

weixin_29325007的博客 1014

跨域请求避免OPTIONS请求(预检请求)

有时候前后端分离域名不一致,会造成跨域请求 而跨域请求有时候会自动发起两次请求,第一次为预检请求,即OPTIONS请求 一般来说使用 application/json 的 post 请求是必然会带入OPTIONS请求 OPTIONS请求也被称为预检请求,主要用于获知服务端支持的HTTP请求方法。跨域资源共享(CORS)标准新增了一组 HTTP 首部字段,配合预检请求可获知服务器允许哪些源站通过浏览器有权限访问哪些资源。 但是在有些get请求中也会OPTIONS请求,这里补充下回发生options的情况 当发

Turbo 1万+

YOLOv12涨点改进 | Neck特征融合改进篇 | YOLOv12引 入 BiFPN双向特征金字塔网络,显著提升了多尺度特征融合效率,目标检测、图像分割、图像分类,助力高效涨点

本文提出了一种基于BiFPN特征融合模块优化的YOLOv12目标检测方法。BiFPN通过引入可学习的权重实现高效的多尺度特征融合,结合双向连接机制提升特征提取能力。实验表明,该方法在COCO数据集上实现了优异的检测性能。文章详细介绍了BiFPN模块的原理、核心代码实现,以及如何将其集成到YOLOv12框架中,包括模块添加、配置文件修改等具体步骤。这种改进方案具有参数少、计算量小等优势,为高效目标检测提供了一种新的技术路径。

Ai缝合怪、助力小伙伴高效发论文 392

微信群“智”变:扣子机器人无缝接入实战

本文介绍了如何将扣子(Coze)机器人接入微信群实现智能化管理。文章首先阐述了扣子机器人的自然语言处理、自动分类和多模态交互等功能特点,以及其深度学习模型和持续学习能力的技术优势。随后详细讲解了接入步骤:从微信公众号配置、扣子平台机器人创建,到使用Flask框架实现消息转发功能的关键代码。通过电商客服和技术社群两个实际案例,展示了扣子机器人在提升响应效率、优化社群运营方面的显著效果。最后展望了未来在智能推荐、多模态交互等领域的发展潜力,为微信群智能化管理提供了实用解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 832

Nginx 设置禁用 OPTIONS 请求以及允许跨域

1、修改 nginx 配置 在 nginx.conf 配置文件中,增加如下内容: if ($request_method ~* OPTIONS) { return 403; } 效果如下:(如果配置了SSL,则需要在SSL也配置一下) 2、重启 nginx 服务 /usr/local/nginx/sbin -s reload systemctl restart nginx service nginx restart 3、功能验证 使用如下命令: curl .

wd520521的博客 8203

机器人中的数值优化(一)—— 数学优化、凸集合与凸函数

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例。

慕羽★的博客 2521

CORS与OPTIONS请求

跨域不是后端的问题,是。

JacinLee的博客 1410

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

透析 HTTP OPTIONS 预检请求

(Same-Origin Policy),禁止网页向不同源的服务器发送某些类型的请求(如带有自定义Header的请求或非简单请求方法)。HTTP OPTIONS 预检请求是浏览器在发送某些跨域请求(CORS,跨源资源共享)之前自动发起的一种机制,它是现代浏览器实现CORS规范的关键安全措施,目的是保护服务器免受恶意跨域请求的攻击。实际请求是否被允许,避免直接发送可能被服务器拒绝的敏感请求。如果服务器响应允许实际请求,浏览器继续发送真正的请求(如。如果服务器拒绝,浏览器抛出CORS错误,阻止实际请求。

橘导的博客 1566

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HTTP访问控制(CORS)——预检请求问题的解决

文章目录1:CORS介绍2:什么情况下需要 CORS3:跨域资源共享机制功能概述3.1 若干访问控制场景案例演示 1:CORS介绍 CORS (Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的HTTP头组成,这些HTTP头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。 同源安全策略 默认阻止“跨域”获取资源。但是 CORS 给了web服务器这样的权限,即服务器可以选择,允许跨域请求访问到它们的资源。 CORS 头 Access

qq_44891295的博客 9839

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Vue笔记:options预检请求

第一次遇到options请求,看了一些资料和别人的博客才有所了解 第一步,先了解了几个概念: CORS:(Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的HTTP头组成,这些HTTP头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。(参考MDN术语表) 同源安全策略 默认阻止“跨域”获取资源。但是 CORS 给了web服务...

qq_43485284的博客 2342

预检请求OPTIONS

最近在项目偶然发现使用第三方文件管理系统上传文件时,上传请求会发送两次。发现第一个是预检请求OPTIONS。 老早就知道HTTP请求方法有OPTIONS,但从来没使用过,一时引起了兴趣,遂查阅了相关资料。 什么是OPTIONS请求 OPTIONS请求也被称为预检请求,主要用于获知服务端支持的HTTP请求方法。跨域资源共享(CORS)标准新增了一组 HTTP 首部字段,配合预检请求可获知服务器允许...

随风丶逆风的博客 2046

【PHP跨域预检请求终极指南】:彻底搞懂OPTIONS请求与CORS机制

轻松解决PHP跨域难题,深入解析预检请求处理机制。涵盖CORS原理、OPTIONS请求响应配置及实际应用场景,教你通过PHP正确设置响应头,避免浏览器拦截。掌握核心方法,实现前后端安全通信,值得收藏。

PixelGlow的博客 613

CORS预检请求深度解析:OPTIONS方法在Laravel中的处理机制

CORS预检请求是现代Web开发中处理跨域资源共享的核心机制,特别是在Laravel框架中,OPTIONS方法的正确处理对于构建安全高效的API服务至关重要。本文将深入解析CORS预检请求在Laravel中的完整处理流程。 ## 🚀 什么是CORS预检请求? CORS预检请求是浏览器在发送实际请求前,自动发起的一个OPTIONS请求。当请求满足以下条件时,浏览器会触发预检请求: - 使用P

gitblog_00911的博客 810

对CORS OPTIONS预检请求的一些思考

前后端分离模大势所趋,跨域问题更是老生常谈。《程序员应对浏览器同源策略的姿势》一文提到三种跨域请求方案,重点讲述了w3c和浏览器厂商推出的CORS规范。同源策略所谓同源是指域名、协议...

qq_30236895的博客 843

SpringSecurity跨域预检拦截解决方案--- OPTIONS 预检请求

【摘要】前端跨域请求被Spring Security拦截,导致CORS预检失败。问题核心在于未放行OPTIONS请求,使浏览器预检请求返回403错误。解决方案包括:1)配置CORS过滤器允许所有源、头和方法;2)在Spring Security中显式放行OPTIONS请求。关键代码为.antMatchers(HttpMethod.OPTIONS,"/**").permitAll()和CorsFilter配置。修复后预检请求将通过,跨域通信可正常进行,生产环境建议细化域名限制提升安全性。

m0_74296492的博客 756

OPTIONS 预检请求是什么?

OPTIONS 请求是 HTTP 协议中的一种请求方法。它是 HTTP/1.1 规范中引入的,属于“预检请求”(preflight request)的一部分,主要用于跨域资源共享(CORS, Cross-Origin Resource Sharing)的场景中,但也适用于其他需要了解服务器功能的场合。

stay hungry, stay foolish 1460

为什么你的axios请求总丢cookie?图解CORS预检与withCredentials的相爱相杀

本文深入解析了axios请求中cookie丢失的常见问题,重点探讨了CORS预检机制与withCredentials配置的冲突。通过图解Chrome开发者工具的实际案例,详细介绍了如何正确配置SpringBoot服务端响应头,避免Access-Control-Allow-Origin通配符错误,并提供性能优化技巧和现代前端框架的集成方案,帮助开发者彻底解决跨域认证问题。

css33的专栏 1009

【HTTP知识】HTTP OPTIONS 预检请求深度解析与优化策略

HTTP OPTIONS预检请求优化指南 本文深入解析了HTTP OPTIONS预检请求在CORS安全机制中的关键作用,通过流程图和对比表格展示了简单请求与非简单请求的核心区别。针对预检请求的性能问题,提供了3大优化策略:1)通过调整请求参数转为简单请求;2)利用Access-Control-Max-Age设置长期缓存;3)服务器端配置优化。特别提出了避免预检的创新方案,包括反向代理、WebSocket替代和JSONP技术。最后给出了带凭证请求和动态Origin处理的实用代码示例,并介绍了性能监控方法,为开

wendao76的专栏 1277
上一篇: 安利一款 Redis 神器:Tiny RDM!颜值与实力并存
下一篇: 老乡鸡把菜谱在GitHub开源了,还说要给程序员发会员卡
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值