j2ee页面静态化方案encache web cache框架源码分析2(七)

2014-11-24 08:12:19 · 作者: · 浏览: 7
fied headers

//trim the milliseconds off the value since the header is only accurate down to the second
long lastModified = pageInfo.getCreated().getTime();
lastModified = TimeUnit.MILLISECONDS.toSeconds(lastModified);
lastModified = TimeUnit.SECONDS.toMillis(lastModified);

headers.add(new Header("Last-Modified", lastModified));
headers.add(new Header("Expires", System.currentTimeMillis() + ttlMilliseconds));
headers.add(new Header("Cache-Control", "max-age=" + ttlMilliseconds / MILLISECONDS_PER_SECOND));
headers.add(new Header("ETag", generateEtag(ttlMilliseconds)));

return pageInfo;
}
@Override
protected void writeResponse(HttpServletRequest request, HttpServletResponse response, PageInfo pageInfo)
throws IOException, DataFormatException, ResponseHeadersNotModifiableException {

final List> headers = pageInfo.getHeaders();
for (final Header< extends Serializable> header : headers) {
if ("ETag".equals(header.getName())) {
String requestIfNoneMatch = request.getHeader("If-None-Match");
if (header.getValue().equals(requestIfNoneMatch)) {
response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
// use the same date we sent when we created the ETag the first time through
//response.setHeader("Last-Modified", request.getHeader("If-Modified-Since"));
return;
}
break;
}
if ("Last-Modified".equals(header.getName())) {
long requestIfModifiedSince = request.getDateHeader("If-Modified-Since");
if (requestIfModifiedSince != -1) {
final Date requestDate = new Date(requestIfModifiedSince);
final Date pageInfoDate;
switch (header.getType()) {
case STRING:
pageInfoDate = this.getHttpDateFormatter().parseDateFromHttpDate((String)header.getValue());
break;
case DATE:
pageInfoDate = new Date((Long)header.getValue());
break;
default:
throw new IllegalArgumentException("Header " + header + " is not supported as type: " + header.getType());
}

if (!requestDate.before(pageInfoDate)) {
response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
response.setHeader("Last-Modified", request.getHeader("If-Modified-Since"));
return;
}
}
}
}

super.writeResponse(request, response, pageInfo);
}
}

这个类对于缓存的内容的头信息 Last-Modified Expires Cache-Control ETag删除,替换成当前encache里面的系统信息,输出的时候也输出encache处理过的头信息,这样我们就不管浏览器的缓存处理了,只能等待encache的缓存过期。

4.PageFragmentCachingFilter的简单处理

[java]
protected PageInfo buildPage(final HttpServletRequest request, final HttpServletResponse response,