预检请求:为跨域请求保驾护航(下)

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 四、预检请求的实际应用场景
    • AJAX 跨域请求
    • WebSocket 连接
  • 五、预检请求的注意事项与限制
    • 缓存问题
    • 对服务器性能的影响
    • 预检请求的常见错误处理
  • 六、总结
    • 预检请求的重要性和意义

四、预检请求的实际应用场景

AJAX 跨域请求

预检请求的实际应用场景之一是 AJAX 跨域请求。

在 Web 开发中,跨域请求是一种常见的需求,例如,当需要从不同域名的 API 获取数据时。然而,浏览器出于安全考虑,默认不允许跨域请求。为了解决这个问题,开发者可以使用 CORS(跨域资源共享)技术。

然而,CORS 技术在某些情况下需要使用预检请求。当使用某些非简单请求(如 POST、PUT、DELETE 等)或自定义请求头时,浏览器会自动发送预检请求。

以下是一个使用 AJAX 发送跨域请求的示例:

// 发送预检请求
fetch('https://example.com/api/data', {method: 'OPTIONS',headers: {'Origin': 'http://example.com','Access-Control-Request-Method': 'GET','Access-Control-Request-Headers': 'X-Custom-Header'}
}).then(response => response.json()).then(data => {// 处理预检请求的响应console.log(data);});// 发送正式请求
fetch('https://example.com/api/data', {method: 'GET',headers: {'Origin': 'http://example.com','X-Custom-Header': 'custom value'}
}).then(response => response.json()).then(data => {// 处理正式请求的响应console.log(data);});

在这个示例中,首先发送了一个预检请求,询问服务器是否允许使用 GET 方法获取数据,以及是否允许携带自定义请求头 X-Custom-Header。服务器响应允许后,再发送正式的 GET 请求,获取数据。

总之,预检请求在 AJAX 跨域请求中具有实际应用场景,它可以确保请求的安全性,提高请求成功率,避免跨域问题。

WebSocket 连接

预检请求的实际应用场景之一是 WebSocket 连接。

WebSocket 是一种网络通信协议,它提供了在浏览器和服务器之间建立双向通信通道的方法。WebSocket 允许服务器向客户端发送数据,也允许客户端向服务器发送数据,这使得服务器和客户端之间的通信更加灵活和高效。

然而,浏览器出于安全考虑,默认不允许跨域 WebSocket 连接。为了解决这个问题,开发者可以使用 CORS(跨域资源共享)技术。

然而,CORS 技术在某些情况下需要使用预检请求。当使用某些非简单请求(如 POST、PUT、DELETE 等)或自定义请求头时,浏览器会自动发送预检请求。

以下是一个使用 WebSocket 建立跨域连接的示例:

// 创建 WebSocket 连接
const socket = new WebSocket('wss://example.com/ws');// 连接成功时触发
socket.addEventListener('open', (event) => {console.log('WebSocket connection opened:', event);// 向服务器发送数据socket.send('Hello, server!');
});// 接收到服务器数据时触发
socket.addEventListener('message', (event) => {console.log('Received from server:', event.data);
});// 连接关闭时触发
socket.addEventListener('close', (event) => {console.log('WebSocket connection closed:', event);
});

在这个示例中,首先尝试建立一个跨域 WebSocket 连接。由于浏览器默认不允许跨域连接,因此需要发送预检请求。预检请求会询问服务器是否允许建立 WebSocket 连接,以及是否允许发送自定义请求头。服务器响应允许后,再建立 WebSocket 连接,并进行双向通信。

总之,预检请求在 WebSocket 连接中具有实际应用场景,它可以确保请求的安全性,提高请求成功率,避免跨域问题。

五、预检请求的注意事项与限制

缓存问题

  1. ETag 和 Cache-Control 头:确保服务器正确设置了 ETag 和 Cache-Control 头,以控制缓存的有效性。不正确的设置可能导致预检请求的缓存问题。
  2. 缓存策略:预检请求的响应可能会被缓存,因此需要考虑合适的缓存策略,避免不必要的预检请求。
  3. 缓存更新:当资源发生变化时,需要确保缓存被及时更新,以避免使用过时的响应。

对服务器性能的影响

  1. 额外的请求:预检请求会增加额外的 HTTP 请求,可能对服务器性能产生一定的影响,尤其是在高并发情况下。
  2. CPU 和内存消耗:预检请求的处理可能会消耗服务器的 CPU 和内存资源,需要注意服务器的资源管理。
  3. 带宽使用:多次预检请求可能会增加网络带宽的使用,特别是在传输大量数据的情况下。

预检请求的常见错误处理

  1. 错误状态码:服务器应返回适当的错误状态码,如 401 表示未经授权,403 表示禁止等,以便客户端正确处理。
  2. 错误消息:在响应中提供有意义的错误消息,帮助客户端理解问题并采取适当的措施。
  3. 重试策略:客户端需要制定合适的重试策略,以处理暂时的错误或失败的预检请求。
  4. 异常情况:考虑处理诸如服务器宕机、网络问题等异常情况,确保系统的可靠性。

这些注意事项和限制在处理预检请求时需要特别关注,以确保系统的正确性、性能和用户体验。根据具体的应用场景和需求,可能需要进一步的优化和调整。如果你对预检请求的其他方面还有疑问或需要更多信息,请随时告诉我。

六、总结

预检请求的重要性和意义

预检请求(Preflight Request)是一种在跨域请求(Cross-Origin Resource Sharing, CORS)中使用的请求,它的目的是为了确保请求的安全性。在跨域请求中,浏览器会限制从不同源(协议、域名或端口不同)的网站请求资源,以防止跨站脚本攻击(XSS)等安全问题。

预检请求的重要性和意义如下:

  1. 确保请求的安全性:预检请求可以确保请求的方法、头部信息和凭据等符合服务器的预期,从而防止跨站脚本攻击等安全问题。通过预检请求,服务器可以对请求进行预先的检查和验证,确保请求的合法性,从而提高请求的成功率。

  2. 提高请求成功率:预检请求可以避免浏览器在发送正式请求时遇到跨域问题,从而确保请求的顺利进行。在某些情况下,如果浏览器无法确定服务器是否允许跨域请求,它可能会尝试发送预检请求,以确保请求的安全性。

  3. 避免跨域问题:预检请求可以避免浏览器在发送正式请求时遇到跨域问题,从而确保请求的顺利进行。通过预检请求,浏览器可以获取服务器允许的请求方法、头部信息和凭据等信息,从而确保请求的合法性。

总之,预检请求在跨域请求中具有重要的意义,它可以确保请求的安全性,提高请求成功率,避免跨域问题。

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

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

相关文章

svg图片构造QGraphicsSvgItem对象耗时很长的问题解决

目录 1. 问题的提出 2. 问题解决 1. 问题的提出 今天通过一张像素为141 * 214,大小为426KB的svg格式的图片构造QGraphicsSvgItem对象,再通过Qt的Graphics View Framework框架,将QGraphicsSvgItem对象显示到场景视图上,代码如下&…

【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II

LeetCode685. 冗余连接 II 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。 输入一个有向图,该图由…

离线数仓(二)【用户行为日志采集平台搭建】

用户行为日志采集平台搭建 1、用户行为日志概述 用户行为日志的内容,主要包括用户的各项行为信息以及行为所处的环境信息。收集这些信息的主要目的是优化产品和为各项分析统计指标提供数据支撑。收集这些信息的手段通常为埋点。 目前主流的埋点方式,有代…

CleanMyMacX需要付费吗?多少钱?有哪些新功能

CleanMyMac X是一个付费应用程序**,需要许可证或订阅来解锁所有功能。不过,CleanMyMac X提供免费试用版供您访问其有限的功能。在试用模式下,用户可以使用部分功能进行体验,但这并非完全免费,因为某些功能会受到限制。…

怎样才能使网页跳转更加顺畅和自然?

网页跳转是用户在使用网页时经常遇到的操作,一个好的跳转设计可以提升用户体验,提高用户满意度。然而,有些网页的跳转设计却常常给用户带来不好的体验,比如页面加载缓慢、跳转速度慢、页面卡顿等问题。那么,怎样才能使…

在SpringBoot中@PathVariable与@RequestParam的区别

PathVariable GetMapping("/{userId}")public R<User> getUserById(PathVariable Long userId) {return userService.getUserById(userId);} // 根据id获取一条数据 function getStudentDataByIdAndDisplayInput(id) {// 发送 AJAX 请求$.ajax({url: /dorm/st…

Elasticsearch:将 IT 智能和业务 KPI 与 AI 连接起来 - 房间里的大象

作者&#xff1a;Fermi Fang 大象寓言的智慧 在信息技术和商业领导力的交叉点&#xff0c;蒙眼人和大象的古老寓言提供了一个富有洞察力的类比。 这个故事起源于印度次大陆&#xff0c;讲述了六个蒙住眼睛的人第一次遇到大象的故事。 每个人触摸大象的不同部位 —— 侧面、象牙…

Vue3快速上手(八) toRefs和toRef的用法

顾名思义&#xff0c;toRef 就是将其转换为ref的一种实现。详细请看&#xff1a; 一、toRef 1.1 示例 <script langts setup name"toRefsAndtoRef"> // 引入reactive,toRef import { reactive, toRef } from vue // reactive包裹的数据即为响应式对象 let p…

第三篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:pyttsx3实现语音助手经典案例

传奇开心果短博文系列 系列短博文目录Python的文本和语音相互转换库技术点案例示例系列 短博文目录一、项目背景和目标二、雏形示例代码三、扩展思路介绍四、与其他库和API集成示例代码五、自定义语音示例代码六、多语言支持示例代码七、语音控制应用程序示例代码八、文本转语音…

机器人初识 —— 定制AI

一、机器人设计难点 波士顿动力设计的机器人&#xff0c;尤其是其人形机器人Atlas和四足机器人Spot等产品&#xff0c;在技术上面临多重难点&#xff1a; 1. **动态平衡与稳定性**&#xff1a;双足或四足机器人在运动时需要维持极高的动态平衡&#xff0c;特别是在不平坦地面…

LiveGBS流媒体平台GB/T28181功能-自定义收流端口区间30000至30249UDP端口TCP端区间配置及相关端口复用问题说明

LiveGBS自定义收流端口区间30000至30249UDP端口TCP端区间配置及相关端口复用问题说明 1、收流端口配置1.1、INI配置1.2、页面配置 2、相关问题3、最少可以开放多少端口3.1、端口复用3.2、配置最少端口如下 4、搭建GB28181视频直播平台 1、收流端口配置 1.1、INI配置 可在lives…

基于Java SSM框架实现电影售票系统项目【项目源码】

基于java的SSM框架实现电影售票系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring属于…

VNCTF2024misc方向部分wp

文章目录 sqlsharkLearnOpenGLez_msbOnlyLocalSql sqlshark tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt不太像常规的盲注&#xff0c;一次性发送两条很类似的payload&#xff0c;比常规的多了一个least在判断passw…

如果端口显示被占用,无法重启,需要杀掉这些进程服务,再次重启即可

如果端口显示被占用&#xff0c;无法重启&#xff0c;需要杀掉这些进程服务&#xff0c;再次重启即可 jps显示当前有的服务 kill -9 要杀掉服务的对应数字

Eclipse - Reset Perspective

Eclipse - Reset Perspective 1. Window -> Perspective -> Reset Perspective2. Reset Perspective -> YesReferences 1. Window -> Perspective -> Reset Perspective 2. Reset Perspective -> Yes ​​​ References [1] Yongqiang Cheng, https://yo…

html的表单标签(上):form标签和input标签

表单标签 表单是让用户输入信息的重要途径。 用表单标签来完成与服务器的一次交互&#xff0c;比如你登录QQ账号时的场景。 表单分成两个部分&#xff1a; 表单域&#xff1a;包含表单元素的区域&#xff0c;用form标签来表示。表单控件&#xff1a;输入框&#xff0c;提交按…

.net和jar包windows服务部署

一.NetCore 1.创建启动脚本run_instal.bat,例如程序文件为ApiDoc.exe set serviceName"Apidoc Web 01" set serviceFilePath%~dp0ApiDoc.exe set serviceDescription"ApiDoc 动态接口服务 web 01"sc create %serviceName% BinPath%serviceFilePath% sc c…

【Java EE初阶十四】网络编程TCP/IP协议(一)

1. 网络编程 通过网络&#xff0c;让两个主机之间能够进行通信->就这样的通信来完成一定的功能&#xff0c;进行网络编程的时候&#xff0c;需要操作系统给咱们提供一组API&#xff0c;通过这些API来完成编程&#xff1b;API可以认为是应用层和传输层之间交互的路径&#xf…

考研证件照可以自己用手机拍吗?考研证件照p过可以通过审核吗?考研证件照有什么要求

一、考研证件照可以自己用手机拍吗 现在的智能手机相机技术先进&#xff0c;大多都配备了高像素摄像头&#xff0c;使得自拍照片的质量有了大幅提升。相较于传统的证件照拍摄&#xff0c;使用手机自拍考研证件照理论上是可行的。然而&#xff0c;考研证件照需要满足一定的规定…

如何根据需求理解CPU、SoC和MCU的区别

在当今数字化的世界中&#xff0c;我们经常听到关于CPU、SoC和MCU的名词&#xff0c;它们都是计算机科学和电子工程领域中的重要组成部分。然而&#xff0c;这三者之间存在着明显的区别。本文将深入探讨CPU&#xff08;中央处理器&#xff09;、SoC&#xff08;系统芯片&#x…