最后修改与ETag http

时间:2018-11-18 18:00:48

标签: java http

Etag和Last-Modified有什么区别?据我了解:

  1. 用户希望首次从服务器检索项目。
  2. 服务器以该项目作为响应并设置“ Last-Modified”标头。
  3. 当用户要第二次,第三次从服务器检索项目时,服务器将客户端发送的“ Last-Modified”标头与项目的上次修改时间进行比较(如果这些值不同,则返回项目并返回新值)如果它们相同,则发送“ Last-Modified”值,服务器返回305->指示客户端应从客户端的缓存中检索项目。

类似的东西(在非常原始的情况下):

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的原因是什么?有什么区别?

感谢您的澄清。

1 个答案:

答案 0 :(得分:2)

当缓存中的版本已经是最新版本时,可以使用Etag和Last-Modified日期来避免下载实体,但是Etag是专门为此目的而设计的,它具有两个优点:

  • 如何正确使用LastModified日期可能会有些混乱。例如,如果一个实体从一个资源移动到另一个资源,它会得到一个新日期还是保留原来的日期?文件系统通常保留日期,但HTTP服务器不保留日期,因为它破坏了该用例。有很多这样破坏的服务器。

  • 如果资源在同一秒内更新两次,则if-modified-since会中断

  • 如果资源已更新,然后又还原到以前的版本,则它可以获取旧的Etag,并且仍旧需要该资源的旧版本的客户端将识别出不必下载该资源。但是,它需要一个较晚的Last-Modified日期,因此所有使用If-Modified-Since的客户端都必须下载新版本。