首页 > 其他分享 >HTTP的强制缓存和协商缓存

HTTP的强制缓存和协商缓存

时间:2024-04-07 19:34:06浏览次数:21  
标签:缓存 HTTP 请求 过期 Modified Last 强制 资源

HTTP的强制缓存和协商缓存

HTTP的缓存技术

  当我们进行HTTP请求时,需要将请求报文发送给对端,当服务端收到请求后会做出合适的响应。但是如果多次发送相同的请求报文或者每次都请求相同的资源,都需要去请求服务端,获取服务端新的响应资源,会浪费很多资源。如果请求过的资源未修改,是否可以使用上次获取的资源呢?答案是可以的。
  开辟一块缓存空间,每次将请求的资源放入缓存空间,下一次做出相同的请求时,如果资源未修改,就使用本地缓存,如果资源被修改了,那么就请求服务器,重新获取资源,并且将修改过的资源放入本地缓存,以覆盖原来老的资源。

  • HTTP/1.0 与 HTTP/1.1 协议都支持缓存技术,但是 HTTP/1.1 在缓存方面有更为完善的规范,引入了一些新的缓存控制指令(例如Cache-Control),以及更细致的缓存验证机制(例如ETag和If-None-Match头部)来优化缓存的管理和利用。
  • HTTP的缓存技术分为强制缓存和协商缓存。

强制缓存

  当第一次请求一个之前没有获取过的资源时,将资源存入本地缓存中。强制缓存就是利用Expires或者Cache-Control来判断资源是否过期。

  • 如果没有过期,之后的每次请求资源,都会直接使用本地缓存的资源,而不会二次的请求服务器。
  • 如果过期了,并且使用协商缓存,那就利用协商缓存来判断本地资源是否有效可用,如果可用,服务端就会返回一个304报文。如果不可用,那就重新获取资源并且更新本地缓存。
  • 如果过期了,没有使用协商缓存,就无法判断本地资源的有效性,强制缓存就直接向服务端 获取新的资源并且更新本地缓存。

Expires

  这是HTTP1.0版本出现的,是一个绝对时间,表示相应资源的过期时间,是一个GMT(格林尼治标准时间)绝对时间,二次请求资源会将本地系统的GMT时间和Expires进行对比来判断资源是否过期。
  由于系统时间可修改以及每次时区的GMT时间不同,因此我们强制缓存用的多的是Cache-Control来判断是否过期。

Cache-Control

  Cache-Control是一个相对时间,并且包含很多参数:

  • private:客户端可以缓存
  • public:客户端和代理服务器均可缓存;
  • max-age=xxx:缓存的资源将在 xxx 秒后过期;
  • no-cache:表示浏览器在使用缓存之前必须先与服务器确认资源是否过期。即使缓存内容存在,仍需要向服务器发送请求进行验证。
  • no-store:不可缓存
    其中max-age=xxx最为常用,用来判断资源是否过期。

协商缓存

  协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。
  上文中的Cache-Control里面的有一个参数no-cache,不能说由它来决定是否使用协商缓存,但是设置了no-cache,就会使用协商缓存。

If-Modified-Since和Last-Modified

  请求头部中的 If-Modified-Since 字段与响应头部中的 Last-Modified字段实现。
  当第一次获取资源以后,Last-Modified带有这个响应资源的最后修改时间。
  每次请求资源都会与Last-Modified进行对比来判断资源是否过期,如果过期了,就在请求报文中带上If-Modified-Since和Last-Modified交给服务端,服务端拿着请求的资源的最新Last-Modified和请求报文中的Last-Modified进行对比,如果判断没有过期,则响应304使用本地缓存,如果判断过期了,则响应新的资源给客户端。

If-None-Match和ETag

  请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段来实现。
  当第一次获取资源以后,服务端响应报文中带有ETag(唯一标识响应资源)。
  当资源过期以后,会在If-None-Match的值设置为ETag的值发送给服务端。服务端进行判断,如果资源没有修改可以使用本地缓存,则响应304;反之响应新的资源和200。

优先级

  由于Last-Modified是基于时间来设置的,有被篡改的风险,所以优先使用ETag。因此,当同时出现ETag和Last-Modified时,优先判断ETag有没有变化,如果有变化就不会判断Last-Modified了,如果没有变化再使用Last-Modified来判断资源是否过期。

可被缓存的请求方法

幂等且安全的的请求方法才可以被缓存

  • 幂等:多次执行相同的操作,得到的结果都是相同的。
  • 安全:请求服务器的资源不会修改服务器上的资源。
能否缓存请求方法
可被缓存GET、HEAD、OPTIONS
可被缓存,但不鼓励且支持少POST、PATCH
不可被缓存PUT、DELETE、CONNECT、TRACE

总结

  由于协商缓存每次都需要向服务端询问资源是否过期,所以协商缓存适合资源经常修改的情况来使用。
  强制缓存设置了一个过期时间,过期时间内强制使用本地缓存的内容,过期了在作其他处理,因此强制缓存适合长时间不变化的资源。
  有人会有疑问?强制缓存和协商缓存是有关联性的,只有强制缓存过期了才会考虑协商缓存,那么经常修改的资源怎么实现呢?
  可以将max-age=xxx中的xxx设置为0,且使用 no-cache字段即可实现。


     

标签:缓存,HTTP,请求,过期,Modified,Last,强制,资源
From: https://blog.csdn.net/tang20030306/article/details/137463575

相关文章

  • HTTP错误代码大全,http网站状态码各代表了什么?
    响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。响应码分五种类型,由它们的第一位数字表示:1、1xx:信息,请求收到,继续处理2、2xx:成功,行为被成功地接受、理解和采纳3、3xx:重定向,为了完成请求,必须进一步执行的动作4、4xx:客户端错误,请求包含语法错误或者......
  • 3-STM32+W5500远程升级篇OTA(阿里云物联网平台)-STM32通过W5500使用http下载程序文件,
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/STM32W5500AIR202A/alyota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  ......
  • http1.1与http2.0
    http1.1与http2.0 简介http1.0: 1.0版本中每个TCP连接只能发送一个请求,数据发送完毕连接就关闭,如果还要请求其他资源,就必须重新建立TCP连接。(TCP为了保证正确性和可靠性需要客户端和服务器三次握手和四次挥手,因此建立连接成本很高)http1.1:长连接:新增Connection字段,默......
  • 说一下HTTP和HTTPS的区别?
    说一下HTTP和HTTPS的区别?安全性方面:http是明文运输,数据在运输的过程中未加密,存在被窃听和篡改的风险,https通常使用SSL/TLS加密运输数据,保护了数据的机密性和完整性,使得数据在传输的过程中更加安全连接方式不同:http端口是40,https端口是443证书方面:http不需要使用证书,因此存在无......
  • Spring Boot数据缓存之Spring缓存抽象 @Cacheable初体验
    在数据缓存之Cache规范JSR107中对Spring的缓存抽象有了一定的了解,下面通过示例实战对其深入探讨。需要注意的是使用Spring缓存抽象时要关注两点:①确定那些方法需要被缓存    ②缓存策略具体案例如下:1、导入依赖Mysql、Mybatis、W......
  • go | 上传文件分析 | http协议分析 | 使用openssl 实现 https 协议 server.key、serve
    是这样的,现在分析抓包数据test.gopackagemainimport( "fmt" "log" "github.com/gin-gonic/gin")funcmain(){ r:=gin.Default() //Uploadsinglefile r.MaxMultipartMemory=8<<20 r.POST("/upload",func(......
  • 网站HTTP怎么改成HTTPS?
    将网站从HTTP转换为HTTPS,以实现安全的加密通信,需要遵循以下步骤:1.申请SSL/TLS证书-选择证书类型:根据网站的需求选择合适的证书类型,如单域名证书、多域名证书、通配符证书等。对于只有一个主域名的情况,单域名证书通常足够;如果有多个子域名需要保护,可以选择通配符证书;如果......
  • 面试常见问题——http/https的区别,cookie和session的区别
    http:1、简单快速2、传输类型灵活3、无连接4、无状态一般http中存在如下问题:请求信息明文传输,容易被窃听截取。数据的完整性未校验,容易被篡改没有验证对方身份,存在冒充危险 https:首先客户端通过URL访问服务器建立SSL连接。服务端收到客户端请求后,会将网站支持的证......
  • centos7:编译升级 openssh:主要参考“https://github.com/boypt/openssh-rpms”
    参考“https://github.com/boypt/openssh-rpms”  “Releases·boypt/openssh-rpms(github.com)” 安装人家大牛的文档来操作即可。可选的,自行定制 version.env,可进行各种组合! BackportOpenSSHRPM/SRPMforoldCentOSAsimplescripttobuildlatestOpen......
  • 【知识点】Redis-缓存-缓存穿透
    缓存穿透:查询一个不存在的数据,Mysql查询不到也没有写入缓存,导致每次请求都会查询数据库。(比如恶意请求)解决方案:缓存空数据:返回数据为空时仍然缓存(但是需要加过期时间)。优点:简单缺点:消耗内存,可能存在数据不一致情况。布隆过滤器布隆过滤器使用Bitmap(位图)来记载一个数据是......