If-Modified-Since(浏览器) = Last-Modified(服务器)
作用:浏览器端第一次访问获得服务器的Last-Modified,第2次访问把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最
后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就
会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中.
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
If-None-Match(浏览器) = ETag(服务器)
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资
源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资
源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.
使用这样的机制将提高网站的性能
例如: If-None-Match: "03f2b33c0bfcc1:0"
String df = request.getHeader("If-None-Match")==null?"":request.getHeader("If-None-Match"); String dd = request.getHeader("If-Modified-Since")==null?"":request.getHeader("If-Modified-Since"); System.out.println("--"+df+"--"+dd); // response.setDateHeader("Last-Modified", Long.parseLong(json.get("UP").toString())); String token = "w/\"" + DateUtil.parseDate(new Date(),"yyyy-MM-dd HH:mm") + '"'; response.setHeader("ETag", token); // response.setDateHeader("Expires",System.currentTimeMillis()+10000); if(token.equals(df)){System.out.println("ETag match: returning 304 Not Modified! "); //response.setStatus(304); response.sendError(HttpServletResponse.SC_NOT_MODIFIED); // getResponse().setStatus(304); response.setHeader("Last-Modified", dd); }else{ System.out.println("new! "); response.getWriter().write("rs"); response.getWriter().flush(); //response.setHeader("Last-Modified", token); }