如何在Java web应用程序中自动控制静态文件(css、js、image)的版本

How to automate versioning of static files (css, js, image) in a Java web app

本文关键字:css js image 版本 文件 静态 Java web 应用程序 自动控制      更新时间:2023-10-05

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

我想将文件的md5哈希附加到客户端看到的虚拟文件路径(作为目录或文件名的一部分),这样当文件更改时,客户端就会认为它是不同的资源。

我知道如何使用servlet过滤器接收包含该虚拟文件路径的请求,去掉md5哈希,并在目录结构中返回真实的文件名。

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

例如:

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

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

当文件更改时

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

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

如果您正在使用Maven,您可以添加这个很棒的插件:Minify Maven插件。它与您的问题没有直接联系,但您可以使用${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>