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

如何在Java web应用程序中自动控制静态文件(css、js、图像)的版本,java,javascript,css,maven,jakarta-ee,Java,Javascript,Css,Maven,Jakarta Ee,我希望最有效地使用静态文件的浏览器缓存,即始终使用缓存内容,除非文件已更改,在这种情况下获取新内容 我希望将文件的md5哈希附加到客户端看到的虚拟文件路径(作为目录或文件名的一部分),以便在文件更改时,客户端认为它是不同的资源 我知道如何使用servlet过滤器接收包含该虚拟文件路径的请求,剥离md5散列,并在目录结构中返回真实的文件名 我还可以使用过滤器在退出时更改外观文件名,以便客户端浏览器认为它正在请求虚拟文件路径,而不更改实际文件的实际名称或目录结构吗 例如: 实际文件路径=/css/1

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

我希望将文件的md5哈希附加到客户端看到的虚拟文件路径(作为目录或文件名的一部分),以便在文件更改时,客户端认为它是不同的资源

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

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

例如:

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

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

当文件更改时

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


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

如果您使用的是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>

com.samaxes.maven
缩小maven插件
1.7.4
准备包装
缩小
${basedir}/src/main/webapp/
${basedir}/src/main/webapp/
UTF-8
css
样式表
css
style.final.${version}.css
js
script.js
js
script.final.${version}.js
关闭

您需要重写链接。无论何时输出这样的链接,都可以调用一个方法来执行此操作。您使用什么技术生成HTML?使用jsf和html5。css、js和图像直接位于xhtml中。命令链接和按钮用于控制到不同xhtml页面的流程SJSF有内置的解决方案,并通过资源处理程序拥有自己的定制方式。为什么在标题/问题中使用“使用servlet”和“使用servlet过滤器”?请编辑并澄清。当前形式的问题与JSF无关。当然,如果你没有通过
和朋友们将它们作为JSF资源使用,那么肯定不会。明白了-我想我的标题混淆了这个问题。使用servlet/servlet过滤器是我目前关于如何解决这个问题的想法——我应该将其从标题中删除。应用程序运行的技术是jsf、Java8、maven、html5和mongoDb。我正在这个技术堆栈中寻找一个解决方案。这是一个我不知道的有趣的选择。我们正在评估是否可以将其与使用版本号标识当前静态文件的脚本相结合。在这种情况下,源文件将位于其原始目录中,但构建后的目标文件将位于基于Maven构建版本号的目录中。我们将构建一个脚本来标识静态文件的文件路径。谢谢-如果没有更好的建议,我们将在下周尝试,并报告结果。我希望这将对您有所帮助。关于更多信息,在我的例子中,我在maven war插件配置中列出了中的源文件。另外,我在maven clean插件配置中包含了版本化文件,所以我去掉了旧版本。