关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求

embedded/2024/9/23 8:27:45/

一、关于http206状态码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

https://i-blog.csdnimg.cn/direct/6f752f10d4ba4066b525ed8bbcf11378.png" width="1200" />

二、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://www.ppmy.cn/embedded/115498.html

相关文章

Flyway 与 Spring Boot 集成

Flyway 与 Spring Boot 集成 Flyway 是一个流行的数据库版本控制工具&#xff0c;它帮助开发者和运维人员管理数据库模式和数据变更。Flyway 可以自动执行数据库迁移脚本&#xff0c;确保数据库结构在不同环境中的一致性。Spring Boot 与 Flyway 的集成非常紧密&#xff0c;可…

【C语言零基础入门篇 - 16】:栈和队列

文章目录 栈和队列栈栈功能的实现源代码 队列队列功能的实现源代码 栈和队列 栈 什么是栈&#xff1a;功能受限的线性数据结构 栈的特点&#xff1a;先进后出 。例如&#xff1a;仓库进货、出货。 栈只有一个开口&#xff0c;先进去的数据在栈底&#xff08;bottom&#xf…

【linux】df命令

df 命令在 Linux 系统中用于显示磁盘空间的使用情况。它提供了文件系统中各个分区或挂载点的总空间、已用空间、剩余空间以及挂载点等信息。这对于监控和管理磁盘空间非常有用。 基本用法 df [选项] [文件或目录...] 如果不指定文件或目录&#xff0c;df 命令将显示所有当前…

Renesas R7FA8D1BH (Cortex®-M85)的 General PWM的应用实践

目录 概述 1 General PWM介绍 1.1 特性 1.2 定时器选择注意点 2 时钟配置 3 应用案例 3.1 基本定时器应用 3.2 定时器回调函数案例 3.3 输入捕捉功能案例 3.4 更新周期案例 3.5 更新占空比案例 3.6 单次触发脉冲案例 4 测试 4.1 代码介绍 4.2 验证 概述 本文主…

网络工程师学习笔记——网络互连与互联网(二)

IP地址 是电脑在互联网上进行进行通信的“身份证” 是网络号主机号 网络号代表所处的网段&#xff0c;而主机号则代表电脑 ipv4有232个ip地址大约43亿 其中又分为A、B、C、D、E类地址 A&#xff1a;1.0.0.0~127.255.255.255&#xff08;首位0&#xff09; B&#xff1a;1…

招联金融2025秋招--大量招后台、算法

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营…

6.7泊松噪声

基础概念 在OpenCV联合C中给一张图片添加泊松噪声&#xff08;Poisson Noise&#xff09;可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。泊松噪声是一种统计分布服从泊松分布的噪声&#xff0c;通常用于模拟光子计数等场景。 使用泊松噪声的场景 泊松噪声通…

「C++系列」动态内存

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、动态内存1. 使用new和delete①分配单个对象②分配对象数组 2. …