前段时间做了个Filter,对Jar包中的静态资源进行处理。做了服务器端缓存,虽然文件不用每次都提取了,但是还是需要每次通过网络将页面发送给浏览器。最好是做到浏览器端缓存。参考了struts2的org.apache.struts2.dispatcher.DefaultStaticContentLoader的实现:
Calendar cal = Calendar.getInstance();
Calendar lastModifiedCal = Calendar.getInstance();
long now = cal.getTimeInMillis();
cal.add(Calendar.DAY_OF_MONTH, 1);
long expires = cal.getTimeInMillis();
long lastModifiedMillis = lastModifiedCal.getTimeInMillis();
if (request.getDateHeader("If-Modified-Since") > iLastModified) {
//火狐等第二次请求开始都走这
response.setDateHeader("Expires", expires);
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
} else {
//IE第一次走着,以后只要没过期,就不发请求了
response.setDateHeader("Date", now);
response.setDateHeader("Expires", expires);
response.setDateHeader("Retry-After", expires);
response.setHeader("Cache-Control", "public");
response.setDateHeader("Last-Modified", lastModifiedMillis);
res.getOutputStream().write(bBuf);
res.flushBuffer();
}
纠结的问题永远是相同的:浏览器标准不一。W3C定义的应该是通过If-Modified-Since,但是IE不用这个,他检测Expires和Retry-After。这样确实有好处:以后都不用发请求了,但是坏处也是很明确的:标准不同一了,无法确认啥时候不过期。