Etag和Last-Modified有什么区别?据我了解:
类似的东西(在非常原始的情况下):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
Gson gson = new Gson();
Integer lastModified = Integer.parseInt(request.getHeader("Last-Modified"));
String path = request.getPathInfo();
Long id = Long.valueOf(path.substring(1));
if( lastModified == null || ! DB.isRelevant(id,lastModified)){
Data data = DB.getData(id);
response.setHeader("Last-Modified", String.valueOf(data.getModified()));
response.getWriter().println(gson.toJson(data));
response.setStatus(200);
}else{
response.setStatus(305);
}
}
现在,Etag在这种情况下表现如何-弱还是强?据我了解,它是相同的东西,但不是发送“ Last-Modified”值,而是发送Etag标头,并且它的值是一些计算得出的哈希值。
那么使用Etag的原因是什么?有什么区别?
感谢您的澄清。
答案 0 :(得分:2)
当缓存中的版本已经是最新版本时,可以使用Etag和Last-Modified日期来避免下载实体,但是Etag是专门为此目的而设计的,它具有两个优点:
如何正确使用LastModified日期可能会有些混乱。例如,如果一个实体从一个资源移动到另一个资源,它会得到一个新日期还是保留原来的日期?文件系统通常保留日期,但HTTP服务器不保留日期,因为它破坏了该用例。有很多这样破坏的服务器。
如果资源在同一秒内更新两次,则if-modified-since会中断
如果资源已更新,然后又还原到以前的版本,则它可以获取旧的Etag,并且仍旧需要该资源的旧版本的客户端将识别出不必下载该资源。但是,它需要一个较晚的Last-Modified日期,因此所有使用If-Modified-Since的客户端都必须下载新版本。