HTTP Caching 用好了,能够极大的减少服务器负载和减小网络带宽。十分有必要深刻了解下 http 的 caching 协议。html
先来看下请求/响应过程:浏览器
一、用 Last-Modified 头服务器
在第一次请求的响应头返回 Last-Modified 内容,时间格式如:Wed, 22 Jul 2009 07:08:07 GMT。是零时区的 GMT 时间,servlet 中能够用 response.addDateHeader("Last-Modified", date.getTime()); 加入响应头。如图:网络
Last-Modified 与 If-Modified-Since 对应的,前者是响应头,后者是请求头。服务器要处理 If-Modified-Since 请求头与Last-Modified 对比看是否有更新,若是没有更新就返回 304 响应,不然按正常请求处理。若是要在动态内容中使用它们,那就要程序来处理了。工具
ps:servlet 取 If-Modified-Since 能够用 long last = requst.getDateHeader("If-Modified-Since");spa
二、用 Etag 头pwa
不少时间可能不能用时间来肯定内容是否有更新。那能够用 Etag 头,etag 是之内容计算一个标识。计算的方式能够本身决定,好比能够用 crc3二、md5等。orm
Etag 与 If-None-Match 是对应的,前者是响应头,后者是请求头。服务器要判断请求内容计算获得的 etag 是否与请求头 If-None-Match 是否一致,若是一致就表示没有更新,返回304就可,不然按正常请求处理。能够参考:用 HttpServletResponseWrapper 实现 Etag 过滤器
三、用 Expires 头,过时时间
当请求的内容有 Expires 头的时候,浏览器会在这个时间内不去下载这个请求的内容(这个行为对 F5 或 Ctrl+F2 无效,用 IE7,Firefox 3.5 试了,有效的好比:在地址输入后回车)。
在 servlet 中能够用 response.addDateHeader("Expires", date.getTime()); 添加过时内容。
ps:在 httpwatch 中能够看到 Result 为 (Cached) 状态的。
四、用 max-age 的 Cache-Control 头
max-age 的值表示,多少秒后失效,在失效以前,浏览器不会去下载请求的内容(固然,这个行为对 F5 或 Ctrl+F2 无效)。好比:服务器写 max-age 响应:response.addHeader("Cache-Control", "max-age=10");
ps:若是你还要加一些 Cache-Control 的内容,好比:private,最好不要写两个 addHeader,而是一个 response.addHeader("Cache-Control", "private, max-age=10"); 不然 ie 可能对 max-age 无效,缘由它只读第一个 Cache-Control 头。
小结:
Last-Modified 与 Etag 头(便是方式1和2)仍是要请求服务器的,只是仅返回 304 头,不返回内容。因此浏览怎么 F5 ,304 都是有效的。但用 Ctrl+F5 是全新请求的(这是浏览器行为,不发送缓存相关的头)。
Expires 头与 max-age 缓存是不须要请求服务器的,直接从本地缓存中取。但 F5 会忽视缓存(因此使用 httpwatch 之类的 http 协议监察工具时,不要 F5 误认为 Expires 和 max-age 是无效的)。
http 协议监察工具:
Firebox:httpfox、live http header
IE:httpwatch、iehttpheader