【问题标题】:Tomcat is setting no-cache for JS and CSS fileTomcat 正在为 JS 和 CSS 文件设置无缓存
【发布时间】:2024-03-08 19:05:01
【问题描述】:

真令人沮丧。 :P

真的希望这些缓存在用户的浏览器上,但它正在设置这个。

缓存控制:无存储,无缓存, 必须重新验证,检查后 = 0, 预检=0

我该如何阻止这种情况?

我尝试在我们的设置中查找与缓存相关的任何内容。根据文档,使用所有默认值,这意味着它是允许的。像 JS 和 CSS 这样的静态文件有区别吗?

编辑: 我注意到一些 JS 文件被允许缓存,因为 Chrome 说它们是“从缓存中检索的”。但是没有 CSS 文件。

【问题讨论】:

    标签: caching tomcat no-cache


    【解决方案1】:

    您可以编写自己的缓存过滤器,并在您的 web xml 中进行配置。

    Here 你会找到一个基本但很好的例子来说明如何实现它。

    在您的web.xml 中声明您的过滤器:

    <filter>
        <description>Set HTTP headers for a mapping.</description>
        <filter-name>CacheFilter</filter-name>
        <filter-class>your.package.CacheFilter</filter-class>
        <init-param>
            <description>Adds an expires header to the response</description>
            <param-name>header</param-name>
            <param-value>Expires: Thu, 26 Apr 2012 20:00:00 GMT</param-value>
        </init-param>
    </filter>
    

    然后将其映射(将其应用于响应):

    <filter-mapping>
        <filter-name>CacheFilter</filter-name>
        <url-pattern>*.js</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CacheFilter</filter-name>
        <url-pattern>*.css</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    

    您可能还想使用压缩过滤器(方法相同),以减少从服务器发送的数据负载。这个implementation of a gzip filter 为我工作了好几年(沿着缓存过滤器),从来没有遇到过任何问题。

    【讨论】:

    • Tomcat 附带一个压缩过滤器;我建议使用它。还有缓存过滤器?你担心线程安全吗?我会的。
    【解决方案2】:

    或者您可以让 servlet 在响应中设置缓存过期和最后修改的标头。

    我还建议使用 GZIP 压缩 JavaScript 和 CSS。 Tomcat 在其 /examples 目录中附带了一个压缩过滤器,您可以将其连接到适当的 URL。

    您应该组合并缩小您的 JavaScript 和 CSS 以获得更好的性能。

    所有这些都是来自 Firefox 的 YSlow 插件的推荐。您可以看到这些措施在使用 Firebug 插件时的效果。

    【讨论】:

    • 我们已经在压缩 CSS 和 Javascript 文件。我们也在考虑缩小我们的 JS。
    • 原来这是这里描述的最明显的地方。 :D 不知道我怎么会错过它,呵呵。我们正在设置我想要自己手动设置的选项。
    【解决方案3】:
    <FilesMatch "\.(js|css)$">
        ExpiresDefault "now plus 1 week"
    </Files>
    

    在您的 Apache 配置中应该可以解决问题,只要它位于 Tomcat 配置内容之后

    【讨论】:

    • 我们没有使用 Apache,或者至少我无法在生产机器上执行操作。