WebResource resource = resources.getResource(path);
当资源是文件时,检查相关头部,其中checkIfHeaders方法中就对Etag和lastModified头进行检查:
if (resource.isFile()) {
// Checking If headers
included = (request.getAttribute(
RequestDispatcher.INCLUDE_CONTEXT_PATH) != null);
if (!included && !isError && !checkIfHeaders(request, response, resource)) {
return;
}
}
protected boolean checkIfHeaders(HttpServletRequest request,
HttpServletResponse response,
WebResource resource)
throws IOException {
return checkIfMatch(request, response, resource)
&& checkIfModifiedSince(request, response, resource)
&& checkIfNoneMatch(request, response, resource)
&& checkIfUnmodifiedSince(request, response, resource);
}可以看到checkIfHeaders方法检查了4个头:If-Match、If-Modified-Since、If-None-Match、If-Unmodified-Since;
其中如果设置If-None-Match的话,If-Modified-Since会忽略,这两个头分别对应于Etag和Last-Modified,如果没有改变,返回304 Not Modified,对应的方法返回false;
而If-Match头和If-Unmodified-Since头分别表示Etag和last-modified值未改变应该返回文件数据(200 OK),对应的方法返回true,如果不相等返回状态码412,方法返回false;
PS:If-Modified-Since和If-None-Match方法会设置last-modified和Etag响应头;
由此可见,只要这个4个方法任何一个返回了false,都直接返回,不返回文件数据,有两种可能:304, 412;
如果上一步没有return,那么应当返回文件数据:
获取资源对象的eTag和lastModifiedHttp并设置响应的头;
String eTag = null;
String lastModifiedHttp = null;
if (resource.isFile() && !isError) {
eTag = resource.getETag();
lastModifiedHttp = resource.getLastModifiedHttp();
}