关闭

关于浏览器缓存的知识

126人阅读 评论(0) 收藏 举报

1.基本认识

浏览器缓存分为强缓存和协商缓存

强缓存,就是浏览器直接从客户端缓存中加载资源(用于很长时间不更新的资源)

协商缓存,就是浏览器想服务器发出一个请求,这个资源是从服务器拿还是从本地缓存中读取呢(协商),服务器判断这个资源没有改变,就给客户端

返回一个304,告诉客户端直接从缓存读取就行。如果资源改变了,就直接返回这个资源的新版本。

2.原理实现

强缓存原理与实现:
强缓存是通过用expires或者cache-control设置过期时间实现的,xpires是较老的强缓存管理header,由于它是服务器返回的一个绝对时间,在服务器时间与客户端时间相差较大时,缓存管理容易出现问题,比如随意修改下客户端时间,就能影响缓存命中的结果。所以在http1.1的时候,提出了一个新的header,就是Cache-Control,这是一个相对时间,在配置缓存的时候,以秒为单位,用数值表示,如:Cache-Control:max-age=315360000。强缓存可能会引发一个问题,就是如果过期时间还没到,而服务器已经更新了该资源,如何将该资源通知到到浏览器让其更新呢?
此问题暂时不讨论。
java.util.Date date = new java.util.Date();    
response.setDateHeader("Expires",date.getTime()+20000); //Expires:过时期限值 
response.setHeader("Cache-Control", "public"); //Cache-Control来控制页面的缓存与否,public:浏览器和缓存服务器都可以缓存页面信息;
response.setHeader("Pragma", "Pragma"); //Pragma:设置页面是否缓存,为Pragma则缓存,no-cache则不缓存

协商缓存的原理与实现:
前文说到协商缓存是服务端来判断请求资源是否是最新的,是否需要更新。服务器其实是根据【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的。请求时用If-Modified-Since,响应用Last-Modified。
1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间:
2)浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header,这个header的值就是上一次请求时返回的Last-Modified的值:

3)服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容。当服务器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header,因为既然资源没有变化,那么Last-Modified也就不会改变。

4)浏览器收到304的响应后,就会从缓存中加载资源。

5)如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified Header在重新加载的时候会被更新,下次请求时,If-Modified-Since会启用上次返回的Last-Modified值。

3.浏览器行为对缓存的影响

如果资源已经被浏览器缓存下来,在缓存失效之前,再次请求时,默认会先检查是否命中强缓存,如果强缓存命中则直接读取缓存,如果强缓存没有命中则发请求到服务器检查是否命中协商缓存,如果协商缓存命中,则告诉浏览器还是可以从缓存读取,否则才从服务器返回最新的资源。这是默认的处理方式,这个方式可能被浏览器的行为改变:

1)当ctrl+f5强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;

2)当f5刷新网页时,跳过强缓存,但是会检查协商缓存;










0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:17107次
    • 积分:670
    • 等级:
    • 排名:千里之外
    • 原创:44篇
    • 转载:21篇
    • 译文:5篇
    • 评论:1条
    文章分类
    最新评论