java - 如何在 Java Web 应用程序中自动对静态文件(css、js、图像)进行版本控制

标签 java javascript css maven jakarta-ee

我想最有效地使用静态文件的浏览器缓存,即始终使用缓存的内容,除非文件已更改,在这种情况下获取新内容。

我想将文件的 md5 哈希值附加到客户端看到的虚拟文件路径(作为目录或文件名的一部分),以便当文件更改时,客户端认为它发生了变化是不同的资源。

我知道如何使用 servlet 过滤器来获取包含该虚拟文件路径的请求并剥离 md5 哈希值,并返回目录结构中的真实文件名。

我是否还可以使用过滤器来更改出路时的表观文件名,以便客户端的浏览器认为它正在请求虚拟文件路径,而不更改我的实际文件的实际名称或目录结构?

例如:

真实文件路径 =/css/1.css

虚拟文件路径 =/static/1234/css/1.css

当文件改变时

真实文件路径 =/css/1.css

虚拟文件路径 =/static/3451/css/1.css

最佳答案

如果您使用Maven,您可以添加这个很棒的插件:Minify Maven Plugin 。它与您的问题没有直接关联,但您可以使用 ${version} 将 CSS/JS 文件的最终名称与应用程序的版本连接起来(您应该能够在您的进口)。 每次构建应用程序的新版本时,您都应该有新的 CSS/JS 文件(按新版本号)并强制浏览器再次下载它。

示例:

<plugin>
    <groupId>com.samaxes.maven</groupId>
    <artifactId>minify-maven-plugin</artifactId>
    <version>1.7.4</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>minify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <webappSourceDir>${basedir}/src/main/webapp/</webappSourceDir>
        <webappTargetDir>${basedir}/src/main/webapp/</webappTargetDir>
        <charset>UTF-8</charset>
        <cssSourceDir>css</cssSourceDir>
        <cssSourceFiles>
            <cssSourceFile>style.css</cssSourceFile>
        </cssSourceFiles>
        <cssTargetDir>css</cssTargetDir>
        <!-- Your final CSS file -->
        <cssFinalFile>style.final.${version}.css</cssFinalFile>

        <jsSourceDir>js</jsSourceDir>
        <jsSourceFiles>
            <jsSourceFile>script.js</jsSourceFile>
        </jsSourceFiles>
        <jsTargetDir>js</jsTargetDir>
        <!-- Your final JS file -->
        <jsFinalFile>script.final.${version}.js</jsFinalFile>
        <jsEngine>CLOSURE</jsEngine>
    </configuration>
</plugin>

关于java - 如何在 Java Web 应用程序中自动对静态文件(css、js、图像)进行版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471458/

相关文章:

javascript - 如何为 HTML 表格创建所需的 JSON?

javascript - jQuery 水平 Accordion 空间在动画时最右边

php - 打印适合页面的 html 表格

java - 从整数 ArrayList 中删除前导零

java - 使用 java 从 Google Drive 下载 Google Docs 文件

javascript - 如何在复选框单击时停止事件冒泡

javascript - 阻止将 _sync 文档保存到 couchbase 服务器

html - Smoothstate 导致 jQuery 函数在每个 session 中运行一次

java - 如何正确映射主键由两个外键组成的实体,其中一个外键本身是复合的?

java - 尝试从数据库中删除时 HT​​TP Status 500 - 请求处理失败