前段时间做了个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。这样确实有好处:以后都不用发请求了,但是坏处也是很明确的:标准不同一了,无法确认啥时候不过期。
优化浏览器缓存策略实现高效资源加载
本文探讨了在Web开发中通过调整缓存策略,实现静态资源的浏览器端缓存,从而减少网络请求,提升用户体验。重点分析了如何利用HTTP头部信息如Expires Cache-Control 和 If-Modified-Since来实现资源的有效缓存,同时讨论了不同浏览器对于这些头部信息的不同处理方式,以及如何解决浏览器标准不一带来的问题。
5884

被折叠的 条评论
为什么被折叠?



