Last-Modified vs ETag http

Dar*_*lyn 1 java http

Etag 和 Last-Modified 有什么区别?就我的理解而言:

  1. 用户想要第一次从服务器检索项目。
  2. 服务器响应该项目并设置“Last-Modified”标头。
  3. 当用户想要第二次、第三次从服务器检索项目时,服务器将客户端发送的“Last-Modified”标头与项目的最后修改时间进行比较,如果这些值不同,则返回项目并返回新的“Last-如果它们相同,则发送“已修改”值,服务器返回 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在 Etag - 弱或强 - 在这方面如何?据我了解,它是相同的,但不是“Last-Modified”值,而是发送 Etag 标头,其值是一些计算出的哈希值。

那么Etag的原因是什么或者有什么区别?

感谢您的澄清。

Mat*_*ans 5

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

  • 如何正确使用 LastModified 日期可能有点令人困惑。例如,如果实体从一种资源移动到另一种资源,它会获得新日期还是保留原始日期?文件系统通常会保留日期,但 HTTP 服务器不应该,因为它破坏了这个用例。有很多服务器以这种方式损坏。

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

  • 如果资源被更新,然后恢复到以前的版本,它可以获得旧的 Etag,并且仍然需要旧版本资源的客户将认识到他们不必下载它。但是,它需要获得较晚的 Last-Modified 日期,因此所有使用 If-Modified-Since 的客户端都必须下载新版本。