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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在 Etag - 弱或强 - 在这方面如何?据我了解,它是相同的,但不是“Last-Modified”值,而是发送 Etag 标头,其值是一些计算出的哈希值。
那么Etag的原因是什么或者有什么区别?
感谢您的澄清。
当缓存中的版本已经是最新的时,Etag 和 Last-Modified 日期都可以用来避免下载实体主体,但 Etag 是专门为此目的而设计的,并且有几个优点:
如何正确使用 LastModified 日期可能有点令人困惑。例如,如果实体从一种资源移动到另一种资源,它会获得新日期还是保留原始日期?文件系统通常会保留日期,但 HTTP 服务器不应该,因为它破坏了这个用例。有很多服务器以这种方式损坏。
如果资源在同一秒内更新两次,则 If-modified-since 中断
如果资源被更新,然后恢复到以前的版本,它可以获得旧的 Etag,并且仍然需要旧版本资源的客户将认识到他们不必下载它。但是,它需要获得较晚的 Last-Modified 日期,因此所有使用 If-Modified-Since 的客户端都必须下载新版本。
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |