关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求
一、关于http的206状态码和416状态码的意义及断点续传
HTTP 2xx范围内的状态码表明客户端发送的请求已经被服务器接受并且被成功处理了,HTTP/1.1 206状态码表示客户端通过发送范围请求头Range抓取到了资源的部分数据,一般用来解决大文件下载问题,一般CDN服务器都会支持这种能力。能否支持206只要看服务端响应头信息中是否存在 accept-ranges: bytes 这种头信息。accept-ranges: bytes表明服务器支持Range请求,以及服务器所支持的单位是字节(这也是唯一可用的单位).Content-Length响应头表明了响应实体的大小,也就是真实的视频等文件的大小,如下即是995664字节。
accept-ranges: bytes
access-control-allow-origin: *
cache-control: max-age=2592000
content-length: 995664
content-md5: Qj7WNfwWVjEqxqjP9Xv1DA==
content-type: application/octet-stream
服务器支持accept-ranges: bytes,即支持断点续传,并且支持同时下载文件的各部分,即下载工具可以利用范围请求加速下载。而Accept-Ranges: none的情况下即表示响应头表示服务器不支持范围请求。对于支持断点续传的服务端,客户端可以使用curl进行简单的测试,比如我们有一张图片:/uploads/pageimg/20200116164037_24480.png 通过请求查看是支持accept-ranges: bytes的,总大小为Content-Length: 5798,我们可以在linux下试验如下:
root@nuser1-24:/opt# curl --header "Range: bytes=0-3000" /uploads/pageimg/20200116164037_24480.png -o part_a% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed
100 3001 100 3001 0 0 10724 0 --:--:-- --:--:-- --:--:-- 10756
root@nuser1-24:/opt# curl --header "Range: bytes=3001-" /uploads/pageimg/20200116164037_24480.png -o part_b% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed
100 2797 100 2797 0 0 18141 0 --:--:-- --:--:-- --:--:-- 18162
root@nuser1-24:/opt# sz part_a
root@nuser1-24:/opt# sz part_b
root@nuser1-24:/opt# cat part_a part_b >> part
root@nuser1-24:/opt# sz part
在下载下来的文件中,part就是一个完整的图片,而part_a图片可以打开(使用windows下的画图软件即可),并且能看到一半的图片,part_b因为没有part_a中的图片头信息无法在windows查看到。
服务端要支持Accept-Ranges bytes也很简单,nginx只需要在配置文件中添加下面这一行即可:
add_header Accept-Ranges bytes;
416状态码是和206状态码相关联的一个状态码,HTTP 416错误代表所请求的范围无法满足 (Requested Range not satisfiable),即请求的range值超过了文件的大小,如下请求设置range为10000以上,而实际文件大小不到6000,就会报416错误:
root@n67:/opt# curl -v --header "Range: bytes=10000-" /uploads/pageimg/20200116164037_24480.png -o part_b% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 114.215.80.214...
* Connected to www.007.cn (114.215.80.214) port 80 (#0)
> GET /uploads/pageimg/20200116164037_24480.png HTTP/1.1
> Host: www.007.cn
> User-Agent: curl/7.47.0
> Accept: */*
> Range: bytes=10000-
>
< HTTP/1.1 416 Requested Range Not Satisfiable
< Server: nginx
< Date: Fri, 17 Jan 2020 10:34:30 GMT
< Content-Type: text/html
< Content-Length: 206
< Connection: keep-alive
< Expires: Sun, 16 Feb 2020 10:34:30 GMT
< Cache-Control: max-age=2592000
< Content-Range: bytes */5798
<
{ [206 bytes data]
100 206 100 206 0 0 7045 0 --:--:-- --:--:-- --:--:-- 7103
* Connection #0 to host www.007.cn left intact
二、CORS使用Access-Control-Allow-Origin来允许跨域请求
因为浏览器的同源策略,浏览器只允许请求当前域的资源,而对其他域的资源以不信任的态度处理。JSONP是可以解决跨域的一些问题,但JSONP只支持GET请求而不支持POST,因此还是有限,而使用Access-Control-Allow-Origin可以应对各种跨域请求。
CORS全称跨域资源共享(Cross-origin resource sharing),这是W3C的标准,即是使用Access-Control-Allow-Origin来允许跨域请求,对这种请求也有标准的处理流程。
对于跨域的请求,浏览器端先向目标服务器发送OPTION请求判断请求头中是否存在Access-Control-Allow-Origin头信息,Access-Control-Allow-Origin是允许跨域请求的标志。如果没有,浏览器就会报错No Access-Control-Allow-Origin header is present on the requested resource
Access to XMLHttpRequest at 'https://007.cn/test/cross' from origin 'https://007.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
因为此时浏览器向目标服务器发送了OPTION请求并携带access-control-request-method和access-control-request-headers告诉目标服务器它的请求方式和所要发送的头信息,检测目标服务器是否准许,示例如下:
Request Method: OPTIONS
access-control-request-headers: content-type,cookies
access-control-request-method: POST
而如果这个OPTION请求未得到200响应的话,则浏览器不会进行下一步。且会报错It does not have HTTP ok status:
Access to XMLHttpRequest at 'https://007.cn/test/cross' from origin 'https://007.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status。
即服务器必须在OPTION请求中响应200状态,并且允许使用的headers和method。此时需要对目标服务器的nginx处理添加一些头信息如下,不一定全部都需要。
add_header Access-Control-Allow-Origin "https://007.com'" always;
add_header Access-Control-Allow-Headers "Content-type,Origin,X-Auth-Token,X-JSON,Cookies,Cookie,Content-Length" always;
add_header Access-Control-Allow-Methods "GET,POST,OPTIONS" always;
add_header Access-Control-Allow-Credentials "true" always;
add_header Access-Control-Max-Age "86400" always;
需要注意的是:Access-Control-Allow-Origin 可以设置为*,但是如果设置为*,则跨域请求不会携带cookie,所以如果需要传输cookie,还是需要有目的允许一些跨域来源地址。
Access-Control-Allow-Credentials表示允许携带认证信息(cookies)
Access-Control-Allow-Methods 不必说,可按需要开放哪些请求方式。
Access-Control-Allow-Headers 表示允许的请求头信息。比如如果这个字段中没有Cookie而同时又需要传输cookie的话,就会报下面的错误:
Access to XMLHttpRequest at 'https://007.cn/test/cross' from origin 'https://007.com' has been blocked by CORS policy: Request header field cookies is not allowed by Access-Control-Allow-Headers in preflight response。
这一步的OPTION请求OK的话,浏览器才会正式执行跨域的请求。上面服务端响应头信息的时候,注意看到最后都带了一个always标志。如果服务端修改后仍没有响应所需要的头信息的时候,可以在最后加个always试试,挺好用。
相关文章:

关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求
一、关于http的206状态码和416状态码的意义及断点续传 HTTP 2xx范围内的状态码表明客户端发送的请求已经被服务器接受并且被成功处理了,HTTP/1.1 206状态码表示客户端通过发送范围请求头Range抓取到了资源的部分数据,一般用来解决大文件下载问题,一般CDN…...

SOMEIP_ETS_114: SD_Entries_Length_wrong_combined
测试目的: 验证DUT能够拒绝一个包含两个正确条目但条目数组长度不正确的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个条目数组长度与实际条目数量不匹配的Sub…...
SQL:DATEDIFF函数
DATEDIFF函数是用于计算两个日期之间的时间间隔的函数,它在不同的编程语言和数据库系统中都有广泛的应用。以下是对DATEDIFF函数的详细解析: 一、函数用途 DATEDIFF函数的主要用途是计算两个日期之间的时间间隔,这个间隔可以是年、季度、月…...

MATLAB 可视化基础:绘图命令与应用
目录 1. 绘制子图1.1基本绘图命令1.2. 使用 subplot 函数1.3. 绘图类型 2.MATLAB 可视化进阶(以下代码均居于以上代码的数据定义上实现)2.1. 极坐标图2.3. 隐函数的绘制 3.总结 在数据分析和科学计算中,数据可视化是理解和解释结果的关键工具。今天,我将…...
掌握 Python 异常处理的实战技巧:从基础到高级应用20240918
掌握 Python 异常处理的实战技巧:从基础到高级应用 引言 在 Python 编程中,异常处理是保障代码稳健性和可靠性的关键要素之一。无论是在网络请求、资源访问,还是复杂的业务逻辑中,异常处理都不可或缺。本文将从 Python 异常的基…...
One API 部署与配置指南
技术文档:One API 部署与配置指南 概述 One API 是一个多功能的 API 管理平台,支持自定义设置、用户管理、多种登录注册方式、主题切换等。本文档提供了详细的部署和配置指南,帮助用户快速搭建和使用 One API。 部署 基于 Docker 部署 D…...
国密起步7:BouncyCastle使用SM4自定义格式加解密C#版
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 github源码指引的指引-CSDN博…...

Qt优秀开源项目之二十三:QSimpleUpdater
QSimpleUpdater是开源的自动升级模块,用于检测、下载和安装更新。 github地址:https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多(911个),但已在很多开源项目看到其身影,比如Not…...
使用 Nmap 进行 SSL/TLS 加密套件枚举
1. Nmap 简介 Nmap(Network Mapper)是一个开源的网络探测和安全审计工具。它广泛用于扫描网络并发现设备、端口及服务,同时也支持多种脚本来进行更高级的安全扫描。Nmap 的 -sV 参数可以用于探测开放端口上的服务及版本信息,配合…...

探索 Python 的火焰:Fire 库的神秘力量
文章目录 🔥 探索 Python 的火焰:Fire 库的神秘力量第一部分:背景介绍第二部分:Fire 库是什么?第三部分:如何安装 Fire?第四部分:简单库函数使用方法第五部分:场景应用第…...

【Day14-单例设计模式动态代理】
单例设计模式 什么是设计模式(Design pattern) ? 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。设计模式有20多种,对应20多种软件开发中会遇到的问题…...
代码随想录训练营Day7 | 454.四数相加II | 383. 赎金信 | 15. 三数之和 | 18. 四数之和
代码随想录 (programmercarl.com) Leetcode 454. 四数相加 II 题目描述 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N&#…...

C++和OpenGL实现3D游戏编程【目录】
欢迎来到zhooyu的专栏。 个人主页:【zhooyu】 文章专栏:【OpenGL实现3D游戏编程】 贝塞尔曲面演示: 贝塞尔曲面演示zhooyu 本专栏内容: 我们从游戏的角度出发,用C去了解一下游戏中的功能都是怎么实现的。这一切还是要…...

03-Mac系统PyCharm主题设置
目录 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavior 4. 点击Appearance 5. 找到Theme进行设置 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavi…...
Java并发的四大定律
每一个进入 Java 并发世界的人,都会不可避免地面临一系列问题:线程安全、并发控制、锁,以及共享资源。这些概念复杂又抽象,往往让人无从下手。幸运的是,业界早已总结出一些法则,这些法则为我们处理并发问题…...

java项目之基于springboot的贸易行业crm系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于springboot的贸易行业crm系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于sp…...
General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model
摘要 传统的OCR系统(OCR-1.0)越来越无法满足人们对智能处理人造光学字符的需求。在本文中,我们将所有人造光学信号(例如,普通文本、数学/分子公式、表格、图表、乐谱,甚至是几何形状)统称为“字…...

二十种编程语言庆祝中秋节
二十种编程语言庆祝中秋节 文章目录 二十种编程语言庆祝中秋节中秋快乐!家人们 🥳一 Python二 C三 C四 Java五 C#六 Perl七 Go八 Asp九 PHP十 JavaScript十一 JavaScript HTML十二 Visual Basic十三 早期 VB十四 Visual C十五 Delphi十六 Shell十七 Cobo…...

202409012在飞凌的OK3588-C的核心板上使用Rockchip原厂的Buildroot点MIPI屏【背光篇】
202409012在飞凌的OK3588-C的核心板上使用Rockchip原厂的Buildroot点MIPI屏【背光篇】 2024/9/12 10:44 缘起,拿到一块MIPI屏,需要使用飞凌的OK3588-C的核心板在Android12下点亮。 在飞凌的Linux R4下修改部分屏参之后即可直接点亮。 但是在飞凌的Andro…...

DMDRS搭建
DMDRS搭建 本次进行DMDRS工具的部署搭建以及使用 环境配置 操作系统及数据库配置 操作系统:使用CentOS7数据库:dm8_20240408_x86_rh7_64 服务器配置 实例名服务器IPDM1192.168.19.7(源DMDRS)DM2192.168.19.4(目的…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...