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

Posted

技术标签:

【中文标题】如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?【英文标题】:How do I add a custom HTTP Request Header to a Thymeleaf generated Form or Link? 【发布时间】:2017-03-16 00:12:24 【问题描述】:

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

有没有办法让 Thymeleaf 使用 XMLHttpRequest 生成链接?我们不想在模板中拖钓,将所有 th:href 锚点替换为 javascript onclick 处理程序。

【问题讨论】:

baeldung.com/java-json-web-tokens-jjwt 【参考方案1】:

简短回答:不!

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

此外,在没有 javascript 的情况下,无法通过表单发布发送自定义标题。因此,您需要编写一些 javascript 来在表单中添加自定义标题。这个自定义的 javascript 应该由你编写 Thymeleaf 没有自动化它的机制。

* 对于未来的cmets:我知道这不准确,不要学究;)


你可以像这样将你的令牌添加到页面中[查看元标记]:

<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>
    ...

然后在所有 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);
    );
);

【讨论】:

以上是关于如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?的主要内容,如果未能解决你的问题,请参考以下文章

将自定义标头添加到“请求”

如何将自定义 HTTP 标头注入 SuperAgent 发出的每个请求?

如何将自定义响应标头添加到来自 azure blob 的响应?

如何在 PowerShell 中运行 appCmd 以将自定义标头添加到默认网站

如何将自定义标头添加到zend Mail Message

如何将自定义标头从 mvc 项目发送到 Web api 项目?