浏览器缓存机制整理

基本情况

浏览器缓存分为强制缓存和协商缓存,整体流程大概如下:

  1. 浏览器在加载资源时,先根据这个资源http header的字段来判断它是否使用强制缓存,如果判断可以使用强制缓存,浏览器就会直接从缓存中读取资源,不再向服务器发送请求,且此时请求返回的状态码为200。
  2. 当强制缓存的判断为否时,浏览器会发送一个请求到服务器,通过服务器返回的http header中的另外一些字段来判断这个资源是否使用协商缓存,如果使用协商缓存,服务器会将这个请求返回,并且请求返回的状态码为304,此时浏览器可以直接从缓存中加载这个资源。
  3. 当协商缓存也不能使用的时候,浏览器会直接从服务器加载资源的数据。
    共同点:如果判断成功,都是直接从浏览器直接加载资源,而不是从服务器获取资源数据
    不同点:强制缓存不会发送请求到服务器,而协商缓存会发送请求到服务器。

强制缓存

强制缓存是利用Expires和Cache-Control这两个http请求的Response Header来进行判断的,它们都用来表示资源在浏览器中的缓存的有效期。Expires和Cache-Control如果同时存在时,以后者为先。
Expires是http1.0提出的强制缓存管理header,它返回的是服务器的一个绝对时间,当服务器时间与浏览器时间相差较大时,缓存管理容易出现问题。而Cache-Control是http1.1中提出的强制缓存管理header,是一个相对时间,如max-age=864000,就不会存在如Expires的这种问题,两个请求头都加上,也是为了兼容不支持http1.1的终端或者路由器。

协商缓存

当浏览器对某个资源的强制缓存的判断为不生效时,就会发送一个请求到服务器,来判断协商缓存是否生效。如果判断生效,请求响应返回的http状态码为304,并且会显示一个Not Modified的字符串,让浏览器从自己的缓存中去加载这个资源。
协商缓存用的是以下两对Header来管理的:

Last-ModifiedIf-Modified-Since
ETagIf-None-Match

Last-ModifiedIf-Modified-Since:

  1. 浏览器第一次向服务器请求一个资源,服务器在返回这个资源的同时,会在response的header上加上一个Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间。
  2. 浏览器再次向服务器请求这个资源时,会在request的heaeder上加上If-Modified-Since的header,这个header的值就是上一次请求时返回的Last-Modified的值。
  3. 服务器再次接受到资源请求时,会根据浏览器传回来的If-Modified-Since的值和资源在服务器上最后的修改时间来判断资源是否有变化,如果没有变化,就返回304 Not Modified,同时不会返回资源的内容;如果有变化,就会正常返回资源内容。当服务器返回304 Not Modified时,response header不会再添加Last-Modified的header,因为此时资源没有发生变化,Last-Modified的值也不会产生变更。

如果协商缓存没有生效而直接从服务器加载资源,Last-Modified这个请求头就会在重新加载资源的时候更新,下次发起请求的时候,If-Modified-Since会使用上次请求头中的Last-Modified的值。
但是有时候服务器上的资源发生了变化,但是最后修改时间却没有发生改变,就可能会影响到协商缓存的可靠性。因此,就有了ETagIf-None-Match这对请求头来管理协商缓存。
ETagIf-None-Match:

  1. 浏览器第一次向服务器请求一个资源时,会在response的header加上ETag这个字段,这是服务器根据当前请求的资源生成的一个唯一标识,只要资源发生了变化,这个值也会随之发生变化,所以能很好地补足Last-Modified的缺陷。
  2. 浏览器再次向服务器请求这个资源时,request的header中就会加上If-None-Match这个字段,这个值就是之前从response中拿到的ETag的值。
  3. 服务器再次受到资源请求时,就会根据浏览器传回来的If-None-Match以及根据资源生成的一个新的ETag的值进行比较。如果这两个值相同,就说明资源没有发生变化,返回304 Not Modified,但不返回资源内容;反之,就会正常返回资源内容。与Last-Modified不同之处在于,当服务器返回304 Not Modified的状态码时,由于ETag重新生成过,response的header中还是会将这个ETag返回,即使这个值并没有发生变化。

总结

协商缓存需要配合强制管理使用,如果不启用强制缓存的话,协商缓存根本没有意义。
如果资源已经被浏览器缓存下来,在缓存失效之前,再次发起请求,默认会先去检查是否使用强制缓存,如果强制缓存可以使用,就会直接使用强制缓存,如果强制缓存失效,则会发起请求到服务器,判断是否使用协商缓存。如果可以使用协商缓存,则会返回304 Not Modified状态码,然后使用缓存,否则就会使用服务器返回的资源。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值