1

我正在使用 Spring MVC 4,并按如下方式处理静态资源(缓存一年):

<mvc:resources mapping="/static/**" location="/static/" cache-period="31556926" />

我的app.js文件static夹中有一个文件。使用 Chrome DevTools启动审核时,该app.js文件显示在以下部分中:

以下资源是明确不可缓存的。如果可能,考虑让它们可缓存:app.js

此静态文件请求的响应标头是:

Date: Mon, 23 Feb 2015 18:02:49 GMT
Expires: Tue, 23 Feb 2016 23:51:36 GMT
Cache-Control: max-age=31556926, must-revalidate

我的静态资源是否被浏览器很好地缓存了?为什么 Chrome DevTools 告诉我这app.js是明确不可缓存的?

4

1 回答 1

1

我在 chrome 审计中看到了类似的奇怪之处,似乎共识是 Chrome 审计可能有问题:

谷歌浏览器缓存审核

除了该引用问题中的其他答案外,我还有两个尚未彻底测试的额外理论,但我认为可能会导致问题:

1) 饼干

当您将 cookie 与图像一起传递时,这在 Java 应用程序中经常发生(jsession 和各种其他 cookie 可能设置在过滤器中)。问题是您似乎没有在标题中向我们显示任何 cookie。此外,较新版本的 chrome 审核通常将此作为单独的错误抱怨。

2)通过DOM变化动态请求内容

一些 Javascript 库,特别是 ACE 编辑会动态添加字体和/或 Javascript(又名 AMD),偶尔会向 URL 添加查询参数。这似乎混淆了 chrome 审计。因此,也许您app.js正在通过其他一些 Javascript 动态添加(即添加<script...src= ></script>元素)和/或向 URL 添加查询参数?

更新

我想我知道你的具体问题是什么。Chrome 审计不喜欢must-revalidate并且不幸的是当你指定一个cache-period大于0SpringResourceHttpRequestHandler时总是会添加must-revalidate到缓存控制头中。如果您没有设置cache-period(它将是-1),那么 Spring 仍然会缓存标头但不会这样做must-revalidate(但是不会max-age导致另一个审计错误消息以下资源缺少缓存过期。未指定过期的资源浏览器可能不会缓存:)

不幸的是,您将需要编写一个过滤器来删除must-revalidate或创建您自己的ResourceHttpRequestHandler 可能扩展和覆盖cacheForSeconds的版本。

其他一些选项是使用资产管道库(如Wro4J)或将 app.js 上传到您的 CDN。

于 2015-04-13T16:25:50.410 回答