谷歌浏览器缓存问题

4

我之前问过这个问题,但没有得到答案,所以我现在添加更多信息。我建立了一个在线服务,它使用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的缓存文件)。

我猜我总是可以使用谷歌库来加载基本库并部分绕过这个问题,但仍然不是理想的解决方案。 - nvrs
在这里,重新问同一个问题是不可接受的行为。如果你想引起问题的注意,你可以在两天后允许在上面放置赏金。你也可以编辑你的问题添加额外的信息,这可能会使你的问题更容易理解和回答。 - user1228
2个回答

5

最近我又遇到了这个问题,我终于找出了Chrome拒绝缓存静态资源的原因,即使头部信息没有问题。这与会话无关,如果您从HTTPS URL请求资源并且服务器使用自签名证书,并且您没有将该证书导入受信任的证书存储,则不会缓存任何内容。我已经解决了这个问题。


关于无效证书的信息很有用! - covener

0

在结尾标记中加上no-transform对有所帮助吗?

Cache-Control:max-age=604800, must-revalidate, public, no-transform

谢谢回复,但不是这样的。 - nvrs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接