浏览器缓存(强缓存与协商缓存)

浏览器在第一次发送请求后,服务端会返回一个last-modified,并且由客户端记录这个修改时间。服务端会生成一个Etag发送给客户端。

浏览器再次请求时,会首先获取缓存的header信息,根据header中的cache-control与expires来判断是否过期,如果过期就重新向服务端发送请求。这就是强缓存。

如果显示已经过期,则向浏览器发送请求,并通过if-none-match将之前的Etag发送给服务器,如果与服务端相同,则设置为false,并返回缓存页面;若不同,则设置为true,返回200,请求数据。客户端还会通过if-modified-since将先前服务器返回的最后修改时间戳发给服务器,服务器判断是否是最新数据,若是则使用缓存,不是则返回新的数据。

强缓存:
利用http头的expires与cache-control来控制,普通刷新会忽略它,不会清除,需要强制刷新。强制刷新时会带上 cache-control:no-cache;pragma:no-cache。

expires:http1.0规范,值是一个绝对时间的GMT格式的时间字符串。表示资源失效时间,这时会出现问题,如果服务器时间与客户端时间偏差大,就会出现缓存时间混乱。此时添加cache-control:max-age=8931000,它的优先级更高,会优先考虑这个最长缓存时间为8931000秒。

cache-control:http1.1规范,主要利用max-age设置失效时间范围。
常用值:
no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认是否被更改,若之前的响应中存在Etag,请求时会与服务端验证,未更改的资源会直接加载。
no-store:禁止缓存,每次请求都重新加载资源。
public:可以被所有用户缓存,包括终端用户与CDN中间代理服务器。
private:只能被终端浏览器缓存。
cache-control与expires可以在服务端配置同时启用,cache-control优先级更高。

协商缓存
由服务器端确定缓存资源是否可用,设置一个标识符Etag来判断。
普通刷新会启用弱缓存,忽略强缓存。只有在地址栏输入或者收藏夹输入网址,通过链接引入资源时才会启用强缓存。
这也就是为什么我们更新图片后,浏览器还是旧的,但在新页面打开图片就是新的。

主要涉及两组字段
Etag / if-none-match
返回校验码,资源变化会导致etag变化,通过if-none-match传递到服务器的标识判断缓存。

last-modified / if-modified-since
第一次请求response会返回last-modified,再次请求时请求头会加上if-modified-since,服务器根据最后修改时间判断是否是缓存。若缓存则返回304,但不会再次返回last-modified。

Etag与last-modified不同的是:即使页面是缓存的,Etag也是重新生成的,response还是会返回,即使与之前的tag相同。

为什么要使用Etag?
正常情况下使用last-modified就可以判断资源缓存了,Etag主要为了解决以下问题:
(1)一些文件会周期性的修改,但不改变文件内容,只改时间,此时并不希望客户端认为文件被修改从而请求资源,此时就用使Etag来判断了。
(2)由于判断时间是s级,只能到秒,若1s内请求n次,则无法判断。
(3)某些服务器不能精确地得到文件最后修改时间。

服务器会优先验证Etag,若相同则会验证last-modified,最后决定是否是缓存资源。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值