我之前问过这个问题,但没有得到答案,所以我现在添加更多信息。我建立了一个在线服务,它使用Spring 3 MVC和Spring Security进行身份验证/授权,JavaScript代码比较重。任何交互都需要HTTPS,因此对于所有请求都开启了HTTPS。服务器设置包括一个Tomcat 7应用服务器(将来可能会增加更多)和一个作为反向代理的Apache2服务器,它使用mod_proxy、mod_cache和mod_deflate。所有可缓存资源(js、css、图像)的缓存头都被设置为:
Cache-Control:max-age=604800, must-revalidate, public
上述标题在Firefox和IE浏览器(至少是我测试过的版本3+和8+)中都有期望的结果,即两个浏览器都会相应地缓存.js和.css文件,除非用户刷新页面,这样浏览器将附加一个
Cache-Control:max-age=0
到请求头,并获得一个304响应,或者使用Cache-Control:no-cache
强制刷新以重新获取资源。
另一方面,Google Chrome的行为不同,尽管它缓存文件,但将它们绑定到用户分配的特定会话上,通过将jsessionid附加到用于在缓存中存储文件的键上。这导致文件每次用户登录/注销或关闭浏览器时从服务器重新获取(Spring安全性具有暂时的sessionid和不同的记住我的一个)。当用户访问登录屏幕并在登录后重定向到主站点时,甚至会两次获取用于登录屏幕以及主站点的主要css(因为现在Chrome忽略了没有与之绑定的sessionid的缓存文件)。