首页 > 其他分享 >【HTTP完全注解】条件请求

【HTTP完全注解】条件请求

时间:2024-03-26 09:00:37浏览次数:26  
标签:标头 HTTP 请求 响应 修改 Match 注解 资源

条件请求

还记得范围请求以及缓存中所介绍的基于时间/版本的验证请求吗?这些能够携带某些条件发起的请求,被称为条件请求。条件请求是HTTP的一种内容协商机制,该机制通过在请求中包含特定的标头来告知服务器仅在某些条件得到满足时才响应。这类请求可以用来验证缓存的有效性,省去不必要的控制手段,帮助减少不必要的数据传输,提高效率,验证文件的完整性,确保资源的一致性和完整性。

条件请求的分类

条件请求正如缓存与范围请求中介绍的那样,分为了基于时间的条件请求与基于版本的条件请求

基于时间的条件请求

基于时间的条件请求依赖Last-Modified响应标头表明资源最后修改时间,依赖If-Modified-Since(缓存、普通请求使用)、If-Unmodified-Since(普通请求使用)或If-Range(范围请求使用)请求标头携带已请求过的资源的最后修改时间,以供服务器检查两资源修改时间是否一致,以此判断资源是否修改。If-Modified-Since是指当资源发生了修改则满足条件,提供资源;而If-Unmodified-SinceIf-Range则是指当资源未发生修改则满足条件,提供资源。

基于时间的条件请求工作流程:

  • 客户端请求资源

  • 服务端响应资源: 服务端响应客户端请求资源,并携带Last-Modified响应标头表明所请求的资源最后修改时间。

  • 客户端发起条件请求: 客户端根据不同的请求使用相关标头携带之前请求过的资源的最后修改时间,对同一资源发起条件请求。

  • 服务端判断并响应资源: 根据请求携带的修改时间,检查服务器当前资源的修改时间是否一致,以此判断资源是否修改。最后根据不同的标头响应资源。

基于时间的条件请求虽然避免了重新传输相同的资源的问题,但它也存在诸多问题:

  • 时钟同步问题: 基于时间的条件请求的前提条件是服务器和客户端的时钟是同步的。如果两者的时钟存在差异,可能会导致验证失败。这种情况下,服务器认为资源已经过期,但实际上客户端的时钟比服务器快或慢,导致了不必要的资源传输。
  • 时间精度问题: 时间戳通常只有秒级别的精度,这可能导致在某些情况下无法检测到资源的真正修改。如果两次修改之间的时间间隔很短,可能无法捕捉到变化。
  • 服务器时钟回退: 如果服务器的时钟回退(例如,由于时钟同步服务的干预),可能会导致客户端认为资源已经过期,尽管实际上它仍然是最新的。
  • 资源未被修改但最后修改时间已变: 有时资源的内容并没有实际修改,但由于某些原因,最后修改时间被更新了。这可能导致不必要的资源传输。

为了解决这些问题,HTTP推出了基于版本的条件请求作为替代方案。

基于版本的条件请求

基于版本的条件请求依赖ETag响应标头表明资源的版本,依赖If-None-Match(缓存、普通请求使用)、If-Match(普通请求使用)或If-Range(范围请求使用)请求标头携带已请求过的资源的版本,以供服务器检查两资源版本是否一致,以此判断资源是否修改。If-None-Match是指当资源发生了修改则满足条件,提供资源;而If-MatchIf-Range则是指当资源未发生修改则满足条件,提供资源。

基于版本的条件请求工作流程:

  • 客户端请求资源

  • 服务端响应资源: 服务端响应客户端请求资源,并携带ETag响应标头表明所请求的资源的版本。

  • 客户端发起条件请求: 客户端根据不同的请求使用相关标头携带之前请求过的资源的版本,对同一资源发起条件请求。

  • 服务端判断并响应资源: 根据请求携带的资源版本,检查服务器当前资源的版本是否一致,以此判断资源是否修改。最后根据不同的标头响应资源。

为什么范围请求要单独规定一个特点的标头If-Range来进行条件请求,而不复用 If-Unmodified-SinceIf-Match呢?

确实对于范围请求来说,可以使用If-Unmodified-SinceIf-Match来进行条件请求,假如前置条件失败,服务器端会返回错误提示,然后客户端可以从头开始重新下载资源:

虽然这种方法行得通,但是它在文件发生变化的情况下增加了一次额外的请求/响应往返,这一点会影响性能。为此 HTTP 协议规定了一个特定的标头—— If-Range——来避免这种情况的发生:

相关标头

标头Last-ModifiedIf-Modified-SinceETagIf-None-MatchIf-Range已在HTTP缓存范围请求章节详细介绍过,因此本节不再重复介绍。

If-Unmodified-Since 请求标头

请求标头If-Unmodified-Since指定了一个绝对时间,其值为之前已请求过的内容的最后修改时间(通常由响应标头Last-Modified指定),携带该标头希望服务器通过检查当前资源的修改时间与该标头携带时间来判断资源是否发生修改。如果资源未发生修改则响应资源返回200状态码,已发生修改则只响应状态码412 Precondition Failed

参数

该请求标头并无其他参数。

取值

  • <date>

    一个绝对时间,其值为之前已请求过的内容的最后修改时间(通常由响应标头Last-Modified指定)

示例

If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT

If-Match 请求标头

请求标头If-Match指定了一个版本号,其值为之前已请求过的内容的版本号(通常由响应标头ETag指定),携带该标头希望服务器通过检查当前资源的版本与该标头携带的版本来判断资源是否发生修改。如果资源未发生修改则响应资源返回200状态码,已发生修改则只响应状态码412 Precondition Failed

参数

该请求标头并无其他参数。

取值

  • W/ 可选

    'W/'(大小写敏感) 表示使用弱验证器。弱验证器很容易生成,但不利于比较。强验证器是比较的理想选择,但很难有效地生成。相同资源的两个弱Etag值可能语义等同,但不是每个字节都相同。

  • “<etag_value>”

    指定一个版本号,表示希望服务器检查资源是否与给定版本号匹配。

  • * 可选

    星号是一个特殊值,可以代表任意资源。它只用在进行资源上传时,通常是采用 PUT 方法,来检测拥有相同识别 ID 的资源是否已经上传过了。

示例

If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
If-Match: W/"67ab43", "54ed21", "7892dd"
If-Match: *


点击链接或微信搜索“汪啊汪” ,关注我及时掌握最新动态

完整手册可关注该仓库,如有帮助,麻烦给个✨

该站点也会同步更新,已满足PWA,您可安装到桌面随时访问

转载需要经过本人同意,并标明出处!

本文由mdnice多平台发布

标签:标头,HTTP,请求,响应,修改,Match,注解,资源
From: https://blog.csdn.net/qq_40160730/article/details/137003811

相关文章

  • 【HTTP完全注解】范围请求
    范围请求范围请求是HTTP的一种内容协商机制,该机制允许客户端只请求资源的部分内容。范围请求在传送大的媒体文件,或者与文件下载的断点续传功能搭配使用时非常有用。范围请求的工作流程范围请求通过在HTTP请求标头Range中表明需要请求的部分资源的字节范围,服务器收到请求......
  • CYarp:力压frp的C#高性能http内网反代中间件
    我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了。随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp的http内网反代项目,这次它的设计完成度是相当高的。开源仓库地址:https://github.com/xljiulang/CY......
  • 4 种标准元注解
    Java中的四种标准元注解是**@Retention、@Target、@Documented、@Inherited**。具体如下:1.**@Retention**:用于指定一个注解的保留策略,即注解在程序的哪个阶段可用。它的取值可以是`RetentionPolicy.SOURCE`(仅在源码中保留,编译时丢弃),`RetentionPolicy.CLASS`(保留到编译时,在JVM中......
  • 谈tcp,http,socket,rpc,grpc
    谈tcp,http,socket,rpc,grpc简介:计算机网络的五(七)层协议:物理层、数据链路层、网络层、传输层、(会话层、表示层)和应用层。tcp:是传输层协议,主要解决数据如何在网络中传输。http:是应用层协议,主要解决如何包装数据(文本信息),是建立在tcp协议之上的应用。tcp协议是以二进制数据流的形......
  • SpringBoot3项目使用Knife4j时访问doc.html出现Knife4j文档请求异常且开发者工具网络
    1.在各个pom.xml中替换Knife4j的依赖版本,升级为4.0以上,如果找不到依赖可以在Maven配置中多添加几个镜像,或者使用汉化插件重启IDEA;<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId......
  • Django框架之csrf跨站请求
    【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而达到攻击的目的。【2】举......
  • 在本地环境配置 https 证书(mac)
    在本地环境配置https证书在使用HTML5的API时,很多API只能在https保证安全的情况下才能开启。这就要求我们在本地开发环境也能够配置https,否则你需要每次部署到配有https的测试环境中才能看到预览效果,这对开发的敏捷度造成了极大的干扰。本文和WebApp的内容没有太......
  • SSL(安全套接层)和HTTPS、应用层协议S-HTTP、PGP
    SSL(安全套接层)和HTTPS安全套接层(SecureSocketLayer,SSL)SecureSocketLayer,SSL是Netscape于1994年开发的传输层协议,面向用于实现Web安全通信1999年,IETF基于SSL3.0版本,制定了传输层安全标准TLS(TransportLayerSecurity)SSL/TLS在Web安全通信中被称为HTTPS......
  • springBoot项目部署整合阿里云https证书报错
    springBoot项目部署整合阿里云https证书一直报错Keystore wastamperedwithor keystorepasswordwasincorrect  在百度没有找到原因,后来在B站上看到大佬说是这个原因,试了一下果然成功了,记录一下。原因是:阿里云的ssl配置yml的密码要用这个格式:key-store-password我配......
  • 【JS】并发请求
    需求封装一个函数,做到可以进行并发请求,并将结果返回。该函数接收两个参数,分别为urls和maxNum。urls是数组,其中元素均为请求地址;maxNum表示最大并发数。如果有完成的请求,会从urls中,按序取出下一个请求,请求的结果会计入返回的数组中,返回的数组中元素的索引与参数urls中保......