http的强缓存和弱(协商)缓存

概念

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

  • 强缓存
用户发送的请求,直接从客户端缓存中获取资源、不发送到服务器。不会与服务器发生任何的交互行为
  • 弱缓存
用户发送的请求,发送给服务器,由服务器判断是否从缓存中拿资源

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使用的,然后搞清楚两者的结合使用关系即可。

你可能感兴趣的:(javascript,http,http缓存)