如何向Thymeleaf生成的表单或链接添加自定义HTTP请求标头?

Mar*_*ler 5 header http jwt thymeleaf spring-boot

我们在Spring Boot应用程序中使用JWT身份验证.为了防止CSRF攻击,我们希望使用自定义HTTP标头而不是cookie将令牌发送回服务器.

有没有办法让Thymeleaf使用XMLHttpRequest来生成生成中的链接?我们不希望通过javascript onclick处理程序替换所有th:href锚点的模板.

des*_*tan 5

简短的回答:不!

长答案:老实说,这个问题是无效的。Thymeleaf 只是一个生成 HTML/XML 的库。XMLHttpRequest也称为 AJAX (*),仅通过 javascript 使用。

此外,如果没有 JavaScript,就不可能通过表单发布发送自定义标头。因此,您需要编写一些 JavaScript 来添加自定义标头和表单。这个自定义 javascript 应该由您编写 Thymeleaf 没有自动执行它的机制。

*对于未来的评论:我知道这不准确,不要迂腐;)


您可以将令牌添加到页面,如下所示[请参阅元标记]:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.w3.org/1999/xhtml"
      layout:decorator="Layout">
    <head>
        <title>Example</title>

        <meta name="_jwt" th:content="${yourToken}"/>
    </head>
    ...
Run Code Online (Sandbox Code Playgroud)

然后在所有 ajax 请求中,您可以读取这些元值并添加为自定义标头。

例如,如果您使用 jQuery,您可以全局配置所有 jQuery ajax 请求,如下所示:

$(function(){
    var _token = $('meta[name="_jwt"]').attr('content');

    $.ajaxPrefilter(function (options, originalOptions, jqXHR) {
        jqXHR.setRequestHeader("your_jwt_token_header_name", _token);
    });
});
Run Code Online (Sandbox Code Playgroud)