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

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过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. 避免跨域问题:预检请求可以避免浏览器在发送正式请求时遇到跨域问题,从而确保请求的顺利进行。通过预检请求,浏览器可以获取服务器允许的请求方法、头部信息和凭据等信息,从而确保请求的合法性。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python面向对象:什么是面向对象程序设计

编程范式 编程即写程序or代码,具体是指程序猿用特定的语法数据结构算法编写代码,目的是用来告诉计算机如何执行任务。 如果把编程的过程比喻为练习武功,那么编程范式指的就是武林中的各种流派,而在编程的世界里最常见的两大流派就…

numpy模块:从基础到高级的完整指南【第88篇—NumPy数组操作】

numpy模块:从基础到高级的完整指南 在Python的科学计算领域,NumPy模块是一个不可或缺的利器。它提供了丰富的数学函数和矩阵操作,使得数据处理、分析和科学计算变得更加高效。本文将带你初步了解NumPy模块,并通过实例代码深入解析…

JUC并发编程

JUC并发编程 JUC概述 JUC是java.util.concurrent包的简称,即Java并发编程工具包,目的是为了更好地支持高并发任务,让开发者进行多线程编程时有效减少竞争条件和死锁线程。 并发编程 一些基本概念: 进程与线程: 进…

C#,二叉搜索树(Binary Search Tree)的迭代方法与源代码

1 二叉搜索树 二叉搜索树(BST,Binary Search Tree)又称二叉查找树或二叉排序树。 一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。 一般地,除了key和位置…

基于 Python 深度学习的车辆特征分析系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

算法之力扣数青蛙

题目连接 文章目录 题目解析算法原理第一步第二步第三步第三步第四步指向o 代码讲解代码实现 题目解析 先给大家来讲解一下这个题目的意思吧,这个题目是说呢给你一个蛙叫的字符串让你去设计一个算法求出发出这种蛙叫最少需要几只青蛙。比如说第一个样例发出这种叫声…

端口号被占用怎么解决

1、快捷键"winR"打开运行,在其中输入"cmd"命令,回车键打开命令提示符。 2、进入窗口后,输入"netstat -ano"命令,可以用来查看所有窗口被占用的情况。 比如端口号为7680的端口被占用了&#xff0c…

Python入门:常用模块—logging模块

logging日志的分级: debug(),info(),warning(),error(),critical() 5个级别 最简单用法 1 2 3 4 import logging logging.warning("user [mike] attempted wrong password more than 3 times") logging.critical("server is down") 输出&…

【洛谷题解】P1601 A+B Problem(高精)

题目链接&#xff1a;AB Problem&#xff08;高精&#xff09; - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;高精度加法 题意&#xff1a; 分析&#xff1a;直接套用高精度加法模版即可 AC代码&#xff1a; #include<bits/stdc.h> using namespace std…

【搭建跨境电商独立站】跨境电商独立站的6大模式,任你选择!

在几年前跨境电商独立站和第三方平台基本上是同步发展起来的&#xff0c;但在后期的发展过程中&#xff0c;独立站经过不同时期的革新&#xff0c;形成了自己的模式。 当你准备好搭建独立站的时候&#xff0c;首先你需要了解的就是独立站运营的模式类型&#xff0c;并找到最适合…

LiveGBS流媒体平台GB/T28181功能-redis订阅国标设备状态redis订阅通道状态subscribe device操作及示例

支持Redis订阅国标设备状态及国标通道状态上线离线 1、设备状态监听的烦恼2、device订阅2.1、设备上线消息2.2、设备离线消息2.2、通道上线消息2.2、通道离线消息 3、订阅示例3.1、连接REDIS3.2、订阅device示例3.3、设备上线示例3.3.1、注册上线后 3.4、设备离线示例3.4.1、注…

批评openai

杨立昆对OpenAI的批评主要集中在几个方面。首先&#xff0c;他反驳了OpenAI首席科学家Ilya Sutskever关于AI可能已经拥有某种自主意识的观点。杨立昆认为&#xff0c;当前的神经网络并不具备这种特定宏架构&#xff0c;因此无法拥有自主意识。他强调&#xff0c;即使是最轻微的…

Stable Diffusion系列(六):原理剖析——从文字到图片的神奇魔法(潜空间篇)

文章目录 LDM概述原理模型架构自编码器模型扩散模型条件引导模型图像生成过程 实验结果指标定义IS&#xff08;越大越好&#xff09;FID&#xff08;越小越好&#xff09; 训练成本与采样质量分析不带条件的图片生成基于文本的图片生成基于语义框的图片生成基于语义图的图片生成…

MyBatis-Plus:通用分页实体封装

分页查询实体&#xff1a;PageQuery package com.example.demo.demos.model.query;import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; import org.springframework.util.St…

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

基于SSM的电影购票系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影购票系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Eclipse 分栏显示同一文件

Eclipse 分栏显示同一文件 1. Window -> EditorReferences 1. Window -> Editor Toggle Split Editor (Horizontal) &#xff1a;取消或设置水平分栏显示 Toggle Split Editor (Vertical) &#xff1a;取消或设置垂直分栏显示 References [1] Yongqiang Cheng, https:/…

综合特征融合的实用图像恢复技术-CMFNet

综合特征融合的实用图像恢复技术-CMFNet 综合特征融合的实用图像恢复技术-CMFNet项目背景与意义模型架构与关键思想代码实现与功能函数恢复效果展示参考资料 综合特征融合的实用图像恢复技术-CMFNet 图像恢复一直是计算机视觉领域的重要研究方向之一。它涵盖了诸多任务&#x…

K8s服务发现组件之CoreDNS/NodeLocalDNS /kubeDNS

1 coredns 1.1 概述 1.1.1 什么是CoreDNS CoreDNS 是一个灵活可扩展的 DNS 服务器&#xff0c;可以作为 Kubernetes 集群 DNS&#xff0c;在Kubernetes1.12版本之后成为了默认的DNS服务。 与 Kubernetes 一样&#xff0c;CoreDNS 项目由 CNCF 托管。 coredns在K8S中的用途,…

Docker原理及概念相关

Docker最核心的组件 image&#xff1a;镜像&#xff0c;构建容器&#xff0c;也可以通过Dockerfile文本描述镜像的内容。 (我们将应用程序运行所需的环境&#xff0c;打包为镜像文件) Container&#xff1a;容器 (你的应用程序&#xff0c;就跑在容器中 ) 镜像仓库(dockerhub)(…