浏览器/缓存相关
🌌缓存协议(Cache-control)
什么是web缓存?
web缓存主要指的是两部分:浏览器缓存和http缓存。 浏览器缓存:比如,localStorage,sessionStorage,cookie等等。这些功能主要用于缓存一些必要的数据,比如用户信息。比如需要携带到后端的参数。亦或者是一些列表数据等等。 前端http缓存。
- http缓存流程图

强制缓存
强制缓存,我们简称强缓存。 从强制缓存的角度触发,如果浏览器判断请求的目标资源有效命中强缓存,如果命中,则可以直接从内存中读取目标资源,无需与服务器做任何通讯。 强缓存是利用http头中的Expires和Cache-Control两个字段来控制的,Expires是http1.0的规范,Cache-Control是在http1.1中出现的。 Cache-Control有一些常设置的值
- private:仅浏览器可以缓存(默认值)
- public:浏览器和代理服务器都可以缓存
- max-age=xxx:过期时间单位秒
- no-cache:不进行强缓存
- no-store:不强缓存,也不协商缓存
协商缓存
Etag和 If-None-Match
- ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。服务器根据浏览器上送的
If-None-Match值来判断是否命中缓存。 - 当服务器返回
304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化。
Last-Modify和if-modified-since
浏览器第一次请求一个资源的时候,服务器返回的header中会加上
Last-Modify,Last-Modify是一个时间标识该资源的最后修改时间,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT。当浏览器再次请求该资源时,request的请求头中会包含
if-modified-since,该值为缓存之前返回的Last-Modify。服务器收到if-modified-since后,根据资源的最后修改时间判断是否命中缓存。如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回
Last-Modify。 对于Etag和If-None-Match的实现,读取资源内容,转成hash值,然后跟Last-Modify和if-modified-since的实现差不多了,同一个道理。
