http的强缓存和弱协商缓存

7次阅读

共计 1002 个字符,预计需要花费 3 分钟才能阅读完成。

概念

浏览器缓存主要分为本地缓存(又称强缓存)和弱缓存(又称协商缓存)

  • 强缓存

用户发送的请求,直接从客户端缓存中获取资源、不发送到服务器。不会与服务器发生任何的交互行为

  • 弱缓存

用户发送的请求,发送给服务器,由服务器判断是否从缓存中拿资源


1、第一次请求的时候,浏览器无缓存,用户发送请求到服务端,服务端响应请求。此时浏览器端将响应进行缓存。具体大概是,第一次请求到服务端时,服务端会把页面的最后修改时间通过在 response-header 的 last-modified 告诉浏览器。浏览器将页面的最后修改时间进行记录。还会生成一个 Etag。
2、用户第二次在访问的时候,浏览器会判断缓存是否过期,

没有过期 ,直接从缓存中获取资源进行呈现。
没有过期 ,会有两种缓存机制的方式,如下:
1、 第一种 是查看是否有 Etag,如果有查看响应服务端资源版本的报文头信息 Etag 是否发生改变(就是查看 Etag,如果发送给服务端的某个资源发生变化了,Etag 就会响应的发生变化),如果发生改变,向服务器请求的时候,会在 request-header 中添加 if-none-match 属性,属性值就是 Etag 的值,本次请求,发送给服务端之后,服务端将属性值和存的 Etag 进行对比。如果服务端验证资源的 Etag 没有改变的时候,将返回 304 状态,告诉浏览器使用本地缓存。因为资源没有更新。如果 Etag 有改变的时候,会返回 200 把新的资源和新的 Etag 响应给浏览器。
2、 第二种 是查看是否有 last-modified,查看值是多少,它代表当前资源的缓存时间 / 即页面的最后修改时间,然后看当前资源的 request-header 中的 last-modified-since。这个是告诉服务器当前资源的缓存时间,请求也会把此时间发送给服务端,服务端会将两者进行对比,如果时间一致,证明没有修改,服务器会返回 304,告诉浏览器直接从本地缓存中获取资源,如果时间不一致,会返回 200 新的资源给浏览器。浏览器拿到之后会丢弃掉之前缓存的,把新的资源缓存,然后每一次请求都会用这种方式。
3、 如果既没有 Etag 又没有 last-modified, 就会直接向服务器请求,服务器响应,然后进行缓存协商。最后呈现。


  • 你就记住,Etag是结合 if-none-match 使用的,last-modified是结合 last-modified-since 使用的,然后搞清楚两者的结合使用关系即可。
正文完
 0