http请求过程当中缓存是如何工做的

一个通常状况下的例子:html

浏览器输入url,第一次发送http请求的时候,确定是不会有缓存这一说的,直接从服务器读取数据。
如下讨论的是第二次之后的输入相同的url,缓存是如何工做的。chrome

一、判断是否有强制缓存

第一次返回http响应的时候, 若是响应中携带cache-control或者expires,这两个字段,
则说明这个资源是设置了强制缓存,
什么意思呢,就是第二次请求这个资源时,在浏览器端,先去判断cache-control或者expires的值,
若是成立,则直接在缓存中获取,不去发送http请求,典型表明200 OK(from memory cache)浏览器

那么是怎么进行判断的呢,
expires是http1的标准,cache-control是http1.1的标准。
expires指定资源的过时时间,浏览器第二次请求时,判断本地时间是否超过了这个过时时间,
若是没有超过,则直接从缓存中取数据,不去发送http请求到服务端,
若是超过过时时间,则发送http请求到服务端缓存

cache-control中有个max-age指令,
expires的意思差很少,也是指定过时时间,
可是和expires不一样的是,max-age指定的值,是个相对值,相对于第一次请求的时间,
也就是说浏览器第二次请求时,若是相对于第一次请求的时间,
没有超过max-age指定的时间,则直接从缓存中取数据,不去发送http请求到服务端;
浏览器第二次请求时,若是相对于第一次请求的时间,
超过max-age指定的时间,则须要发送http请求到服务端。服务器

http响应中若是同时包括expirescache-control,两个须要都知足,才会从缓存中获取资源。
实际中,用一个就能够,cache-control的优先级高于expires
expires是个相对于服务器的绝对时间,若是把本机的时间修改了,和服务器不一致,则不许确了,推荐用cache-control就能够。url

二、判断是否有协商缓存

第一次返回http响应的时候, 若是响应中携带Etag或者last-modified,这两个字段,
则也说明服务器端也但愿这个资源被缓存。code

那么是怎么进行缓存操做的呢
强制缓存不成功,才去判断是否有协商缓存,此时须要发送http请求,
发送http请求时,若是第一次请求返回的响应中携带Etag或者last-modified
则第二次请求头会包含if-none-match或者if-modified-since,
第一次请求返回的响应中Etag指令是响应数据的一个hash值,
第二次请求时,会将这个hash值给到if-none-match
而后在服务器端,计算数据的hash值,得出一个hash,判断这个计算出的hash与if-none-match的hash是否相等,
若是相等,则说明第二次请求的数据并无发生变化,
服务器端会返回304响应状态码,告诉浏览器端,直接取浏览器端的缓存;
若是不相等,服务器端返回200,生成新的Etag值,返回新数据,给到浏览器。htm

if-modified-since的目的和Etag的目的同样,他是个相对于服务器的绝对时间,
若是把本机的时间修改了,和服务器不一致,则不许确了,,若是把本机的时间修改了,则不许确了,推荐用Etag就能够。blog

其余

以上是个正常流程,看一下其余的状况:
一、 第一次返回http响应的时候, cache-controlmax-age为0或者no-cache,
就是服务器端不但愿浏览器直接读取缓存,而是要经过发送http请求,经过Etag或者last-modified等指令去判断是否读取缓存。
这时候要么返回200,要么返回304,不会返回200 OK(from memory cache)
意思就是怎么都要去服务器端去判断一下内容有没有更新,不容许直接读取缓存,资源

二、 发送http请求的时候,若是带有cache-controlmax-age为0,则为浏览器不去判断是否有缓存,直接发送http请求,
chrome刷新浏览器的时候,请求中会默认带上cache-controlmax-age为0,
这种状况就不会返回200 OK(from memory cache)

参考文献:
https://www.cnblogs.com/wonyu...

相关文章
相关标签/搜索