HTTP If-None-Match和ETag , If-Modified-Since和Last-Modified

 

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);
    	}
 

 

 

你可能感兴趣的:(java,http,etag,304)