首页 > 解决方案 > 使用 Thymeleaf 创建 CSRF JS 元标记

问题描述

我不确定这是否可行,但我希望在整个站点使用的 javascript 文件中创建两个 CSRF 元标记(标题和令牌)。但是,我不认为这是可能的,因为百里香叶如何处理来自插值数据变量的数据。

我尝试使用以下代码创建 HTML 元标记元素:

var meta = document.createElement("meta");
meta.setAttribute("name", "_csrf");
meta.setAttribute("th:content", "_csrf.token")

这将创建具有所需值的必要元素(仅显示标记)。但是,当打印出令牌的值时,它会返回“_csrf.token”而不是实际的 csrf 值。我相信这是因为百里香没有正确处理插值。

这些元标记必须手动添加到每个页面的 html 文件中,还是可以使用通用 javascript 文件动态创建?

谢谢!

标签: javascriptthymeleafcsrf

解决方案


我建议使用 layout:dialect 创建一个所有页面都可以访问的模板。您可以将<meta />标签放在那里并在所有页面之间共享。

如果您打算使用 JavaScript,则可以通过与页面相同的 spring 进程运行 JavaScript(如果您已为它正确设置了所有内容)。例如,像这样:

@GetMapping("/your-javascript-name.js")
public String deposit() {
    return "javscript/your-javascript-name";
}

这样你仍然可以在外部包含它:

<script src="your-javascript-name.js"></script>

在 javascript 中,您可以使用 Thymeleaf:

var token = /*[[${_csrf.token}]]*/ '';

var meta = document.createElement("meta");
meta.setAttribute("name", "_csrf");
meta.setAttribute("content", token);

推荐阅读