Java 为什么Chrome开发工具在使用Spring';s mvc:资源?

Java 为什么Chrome开发工具在使用Spring';s mvc:资源?,java,spring,spring-mvc,browser-cache,static-resource,Java,Spring,Spring Mvc,Browser Cache,Static Resource,我正在使用SpringMVC4,并按如下方式处理静态资源(缓存一年): 我的static文件夹中有一个app.js文件。启动时,app.js文件出现在以下部分: 以下资源是显式不可缓存的。如果可能的话,考虑让它们缓存起来。 app.js 此静态文件请求的响应标头为: 日期:2015年2月23日星期一18:02:49 GMT 到期时间:2016年2月23日星期二23:51:36 GMT 缓存控制:最大年龄=31556926,必须重新验证 浏览器是否能很好地缓存静态资源?为什么Chrome开发

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


我的
static
文件夹中有一个
app.js
文件。启动时,
app.js
文件出现在以下部分:

以下资源是显式不可缓存的。如果可能的话,考虑让它们缓存起来。 app.js

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

日期:2015年2月23日星期一18:02:49 GMT
到期时间:2016年2月23日星期二23:51:36 GMT
缓存控制:最大年龄=31556926,必须重新验证

浏览器是否能很好地缓存静态资源?为什么Chrome开发工具告诉我,
app.js
是显式不可缓存的?

我在Chrome audit中也看到了类似的奇怪之处,似乎大家一致认为Chrome audit可能有问题:

除了参考问题中的其他答案外,我还有另外两个理论,我还没有完全测试过,但我认为可能会导致这个问题:

1)Cookies

当您将cookie与映像一起传递时,这在Java应用程序中非常常见(jsession和过滤器中可能设置的各种其他cookie)。问题是您的标题中似乎没有向我们显示任何cookies。更新版本的chrome audit通常会将此作为一个单独的错误进行投诉

2)通过DOM更改动态请求内容

一些Javascript库(尤其是ACE edit)将动态添加字体和/或Javascript(又名AMD),偶尔还会向URL添加查询参数。这似乎混淆了chrome审计。因此,您的
app.js
可能是通过一些其他Javascript(即添加
元素)和/或向URL添加查询参数来动态添加的

更新

我想我知道你的特殊问题是什么。Chrome audit不喜欢
必须重新验证
,不幸的是,当您指定
缓存周期
大于
0
时,Spring
ResourceHttpRequestHandler
将始终将
必须重新验证
添加到缓存控制头中。如果未设置
缓存期限
(它将为-1),则Spring仍将执行缓存头,但不会执行
必须重新验证
(但是没有
最大年龄
会导致另一个审核错误消息,即以下资源缺少缓存过期。未指定过期的资源可能不会被浏览器缓存:)

不幸的是,您需要编写一个筛选器来删除
必须重新验证
,或者创建自己版本的
ResourceHttpRequestHandler


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

谢谢您的回答,我还没有找到您在发布此问题时链接的其他问题。最后一个问题是:是只有Chrome审计工具有这样的行为,还是整个Chrome浏览器?如果它只是一个Chrome审计工具,那么这并不重要,只要浏览器根据需要缓存我的静态资源;)我相信这只是一个审计工具,因为如果你查看devtools的网络选项卡,你可以看到chrome做了正确的事情,即使你刷新了,你也会得到一个304,没有为spring资源处理程序修改。