在 thymeleaf 模板中向 javascript 文件添加随机版本号

tol*_*lga 4 java thymeleaf

我在 thymeleaf 模板中有一个 main.js,每次调用它时我都想添加一个版本参数,这样它就不会被缓存,并且我的最新更改将起作用。

    <script src="/main.js?version=345345456"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

由于它是所有其他模板后面的布局,因此我不想从控制器传递变量。

所以我决定向我的应用程序类添加一个bean方法

@SpringBootApplication
public class NexusApplication {

    @Bean
    public double jsVersion(){
        return Math.random();
    }

}
Run Code Online (Sandbox Code Playgroud)

比我补充的:

<script th:src="@{/js/my-script.js(version=NexusApplication.jsVersion())}"></script>
Run Code Online (Sandbox Code Playgroud)

输出是:

<script th:src="@{/main.js?(version=NexusApplication.jsVersion())}"></script>
Run Code Online (Sandbox Code Playgroud)

我缺少什么?我应该如何更好地处理这个问题?

and*_*mes 5

一种 Java 方法是根据需要使用您的方法生成随机值,或者参见如何在 Java 中生成特定范围内的随机整数?,如果您想要一个具有一定位数的整数。

然后,您可以以通常的 Spring 方式将该值(我们称之为randNumber)添加到模板的模型中 - 例如:

model.addAttribute("randNumber", randNumber);
Run Code Online (Sandbox Code Playgroud)

现在您可以在 Thymeleaf 模板中使用以下内容:

<script th:src="@{/main.js(version=${randNumber})}"></script>
Run Code Online (Sandbox Code Playgroud)

请注意该变量如何需要是${...}.


另一种可能可以接受的替代方法是使用 Thymeleaf 的表达式实用方法来处理随机字母数字字符串:

${#strings.randomAlphanumeric(count)}
Run Code Online (Sandbox Code Playgroud)

例如,对于长度为 5 的字符串:

<script th:src="@{/main.js(version=${#strings.randomAlphanumeric(5)})}"></script>
Run Code Online (Sandbox Code Playgroud)

为此,您不需要任何 Java。

最终结果与第一种方法类似,但可以包含字符和数字:

<script src="/main.js?version=2Q931"></script>
Run Code Online (Sandbox Code Playgroud)