gpt4 book ai didi

java - 为什么 Chrome DevTools 说我的静态资源在使用 Spring 的 mvc :resources? 映射时显式不可缓存

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:19 25 4
gpt4 key购买 nike

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

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

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

The following resources are explicitly non-cacheable. Consider making them cacheable if possible: app.js

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

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 明确不可缓存?

最佳答案

我在 Chrome 审核中看到了类似的奇怪现象,似乎一致认为 Chrome 审核可能存在错误:

Google Chrome audit on caching

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

1) Cookie

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

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

某些 Javascript 库(尤其是 ACE edit)会动态添加字体和/或 Javascript(又名 AMD),有时还会向 URL 添加查询参数。这似乎让 chrome 审核感到困惑。所以也许你的app.js是否通过其他一些 Javascript 动态添加(即添加 <script...src= ></script> 元素)和/或向 URL 添加查询参数?

更新

我想我知道您的具体问题是什么。 Chrome 审核不喜欢 must-revalidate不幸的是,当您指定 cache-period 时大于0 Spring ResourceHttpRequestHandler将始终添加 must-revalidate到缓存控制头。如果不设置cache-period (它将是-1)那么Spring仍然会缓存 header ,但不会执行must-revalidate (但是,没有 max-age 会导致另一条审核错误消息:以下资源缺少缓存过期时间。未指定过期时间的资源可能不会被浏览器缓存:)。

不幸的是,您需要编写一个过滤器来删除 must-revalidate或创建您自己的 ResourceHttpRequestHandler 版本probably extending and overriding cacheForSeconds .

其他一些选项是使用 Assets 管道库,例如 Wro4J或将 app.js 上传到您的 CDN。

关于java - 为什么 Chrome DevTools 说我的静态资源在使用 Spring 的 mvc :resources? 映射时显式不可缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28680608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com