让WEB站点的内容缓存在浏览器中,减少服务器计算开销,避免带宽浪费(网络IO开销)
缓存协商
缓存协商一般基于GET请求的情况,而对于POST类型的请求,浏览器一般不启用本地缓存.
一
Last-Modified 一般Web服务器会为静态文件的HTTP响应头自动生成最后修改时间, 浏览器再次访问时,一般增加
If-Modifed-Since的标记,对于静态内容,Web服务器只要获得静态文件的最后修改时间和浏览器询问的时间进行对比即可.
304 Not Modified 告诉浏览器,内容没有更新,可使用本地缓存
使用这种方式的服务器: nginx
二
ETag
采用一串编码来标记内容. Web服务器为响应头增加ETag的标记,浏览器在HTTP请求头中附加If-None-Match标记.
使用这种方式的服务器: tomcat, apache
基于最后修改时间的缓存协商,用户的请求在服务器之间轮询,实现负载均衡时,这些服务器同一个文件的最后修改时间很难保证完全相同,导致用户的请求在切换到新的服务器时重新获取内容,所以要注意这个问题,最后文件的最后修改时间和内容完全相同.
浏览器缓存截至期Expires
浏览器在内容过期之前不再询问服务器,直接使用本地缓存.
Web服务器一般不开启此标记支持,需要额外配置. apache,nginx都需要增加相应设置
对于常见的静态文件格式,即使没有Expires标记,IE在某种缓存模式下,对GIF图片也设置永不过期,除非可配置Expires马上过期,及设置Expires为当前时间或0.
对于JSP,服务器端的HttpServlet可通过设置特定HTTP响应头来禁止客户端缓存网页,那么只需在JSP的页面头部加入以下代码,
设置response变量引用HttpServletResponse对象,即可达到禁止客户端浏览器缓存页面的效果:
<%
response.addHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expires",0);
%>
“Pragma”选项适用于采用HTTP 1.0的浏览器。在HTTP 1.1中,“Cache-Control”选项来决定客户端是否可以缓存网页,如果取值为“no-cache”,那么客户端不会把Servlet生成的网页保存在本地缓存中。HTTP 1.0和HTTP 1.1都支持“Expires”选项,因此所有的浏览器都能识别该选项。“Expires”选项用于设定网页过期的时间,如果为零,就表示立即过期。如果用户重复请求访问该页面,那么浏览器每次都会从服务器端获取最新的网页数据。
Ctrl+F5强制刷新
F5刷新,对Last-Modified有效,对Expires无效
'转到' Expires只对这种方式有效
适应本地的过期时间 Cache-Control: max-age=<second>
对于静态内容,Web服务器在开启Expries的同时,一般自动添加响应的Cache-Control标记, 浏览器优先考虑Cache-Control