浏览器缓存策略
-----zr
概述:
缓存Cache的思想可以应用在WEB软件分层的各个层面,它是一种内部处理机制。
数据库本身有缓存,持久层也可以缓存,比如Hibernate的1、2级缓存;
业务层也可以缓存,但这个层别是一个过程域,一般不会设置缓存;
表现层也可以实现缓存,一般实现在app server上的缓存机制;
另外Browser浏览器也有缓存,实现在web server上的缓存机制。
总体来说,越是表层的缓存效果越好,越是底层的缓存影响较为深远,不容易控制。
概念:
浏览器缓存即HTTP Cache,指的是web工程师为了加快用户浏览速度,使用浏览器在磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以直接从用户的本地磁盘上获取上次缓存的文档,而不用再到服务端获取,这样就可以加速页面的阅览。
作用:
好的浏览器缓存可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担。
使用缓存过程:
如果使用浏览器缓存,那么当一个客户端请求web服务器,请求的内容可以从以下几个地方获取请求内容:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息。页面文件有三种缓存状态:
1. 最新的:选择不缓存页面,每次请求时都从服务器获取最新的内容;
2. 未过期的:在给定的时间内缓存,如果用户刷新或页面过期则去服务器请求,否则将读取本地的缓存,这样可以提高浏览速度;
3. 过期的:也就是陈旧的页面,当请求这个页面时,必须进行重新获取。
HTTP Cache几个常用属性:
1.Cache-Control:
请求:
no-cache(不要缓存的实体,要求现在从WEB服务器去取)
max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象)
max-stale:(可以接受过去的对象,但是过期时间必须小于max-stale 值)
min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
响应:
public(可以用 Cached 内容回应任何用户)
private(只能用缓存内容回应先前请求该内容的那个用户)
no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端)
max-age:(本响应包含的对象的过期时间)
ALL: no-store(不允许缓存)
2.ETag:
就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag 也会别修改, 所以,ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器 判断一个对象是否改变了。比如前一次请求某个 html 文件时,获得了其 ETag,当这次又请求这个文件时, 浏览器就会把先前获得的 ETag 值发送给 WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比,然后就知道这个文件有没有改变了。
3.Expired:
WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求,是 HTTP/1.0 的头部,例如:Expires:Sat, 23 May 2009 10:02:12 GMT.
4.Last-Modified:
WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT
5.If-Modified-Since:
如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT
If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
实践验证:
1. 关于浏览器的静态缓存:
下面是静态页面http_cache.htm的内容,<