浏览器缓存
一、缓存概念
浏览器第一次向一个web服务器发起http请求后,服务器会返回请求的资源,并且在响应头中添加一些有关缓存的字段如:Cache-Control、Expires、Last-Modified、ETag、Date等等
(1)强缓存:浏览器直接从本地缓存中获取数据,不与服务器进行交互。
(2)协商缓存:浏览器发送请求到服务器,服务器判定是否可使用本地缓存。
(3)联系与区别:两种缓存方式最终使用的都是本地缓存;前者无需与服务器交互,后者需要
(4)Expires、Cache-Control:表示资源的缓存时间。cache-control:两者同时用时,优先级更高,相对时间,相对于客户端的时间。Expires:缓存过期时间,指服务器端的具体的时间点,Expires=max-age + 请求时间。由于失效时间是一个绝对时间,所以当客户端本地时间被修改以后,服务器与客户端时间偏差变大以后,就会导致缓存混乱。于是发展出了Cache-Control
(5)ETag、If-None-Match:服务端为每份资源分配的唯一标识字符串,资源更新时,服务器端的ETag值也随之更新,If-None-Match的值=浏览器的ETag,两者比对判断资源是否改变,响应头会加上ETag字段
(6)Last-Modified、If-Modified-Since:Last-Modified是资源的最后修改时间,If-Modified-Since=浏览器的Last-Modified,两者比对判断资源是否改变,若未更新响应头中不会再添加Last-Modified字段
二、过程

1、检查本地缓存:访问http请求时,浏览器若发现本地有该请求资源的缓存,便开始检查缓存是否过期
(1)若有Cache-Control的S-maxage(多用户使用的公共缓存)或max-age值,用Date+max-age和当前时间比较
(2)若没有以上两个字段,则查看Expires,和当前时间比较
2、强缓存:若缓存未过期,返回状态码为200,则直接从本地读取缓存
3、协商缓存:若发现缓存过期,则发送请求到服务端,让服务端判断缓存是否可用
(1)先判断是否第一次申请资源:浏览器会判断缓存中是否有ETag或Last-Modified字段,如果没有,表示未申请过资源,则发起一个http请求,服务器根据请求返回资源
(2)再判断现有资源是否和服务端最新资源一致:如果有这两个字段,则在请求头中添加If-None-Match字段(有ETag字段的话添加)、If-Modified-Since字段(有Last-Modified字段的话添加)。 如果同时发送这两个字段,服务器只要比较If-None-Match和ETag的内容是否一致即可
(3) 如果If-None-Match和ETag内容一致,服务器认为缓存仍然可用,则返回状态码304(状态未改变),浏览器直接读取本地缓存,这就完成了协商缓存的过程

浙公网安备 33010602011771号