繁体   English   中英

当我在Spring Security中使用PUT方法时,无效的CSRF令牌'null'

[英]Invalid CSRF Token 'null' when i using PUT method with Spring Security

这是我的javascript。 我正在尝试发送PUT消息编辑。

$.ajax({
        url: "/questions/" + _questionId + "/answers/" + answerId + "/edit",
        method: "put",
        data: {
            id : answerId,
            body : body,
            "${_csrf.parameterName}": "${_csrf.token}"
        }

这是服务器代码。

@ResponseBody
@PreAuthorize("hasAuthority('ADMIN') or principal == #answer.content.user")
@RequestMapping(value = "/questions/{questionId}/answers/{answerId}/edit", method = PUT)
void editAnswer(@PathVariable(value = "questionId") Question question, @AuthenticationPrincipal CurrentUser currentUser,
                AnswerForm answerForm, @PathVariable("answerId") String answerId) {

    answerService.edit(answerForm, currentUser.getUser());
}

控制器为PUT方式

当我尝试使用POST方法时,它可以工作。 但我只是更改Method(PUT)服务器和客户端。 在浏览器控制台上,无效的CSRF令牌“ null”和403被禁止。

救命。

似乎无法识别PUT请求主体中的CSRF令牌(Servlet容器不会从PUT请求主体生成参数映射)。

但是您可以将其作为HTTP标头发送:

$.ajax({
    url: "/questions/" + _questionId + "/answers/" + answerId + "/edit",
    method: "put",
    headers: { "${_csrf.parameterName}": "${_csrf.token}" },
    data: {
        id : answerId,
        body : body,
    }
});

查看此链接: https : //gist.github.com/ilake/3656567 我遇到了类似的问题。 如果我使用POST方法,则将<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" /> 但是,如果我在ajax中使用PUT方法。 它不起作用。 然后,我使用标题方法。 标头名称应为X-CSRF-TOKEN, not $ {__ csrf.parameterName}`。 请尝试以下代码:

$.ajax({
url: "/questions/" + _questionId + "/answers/" + answerId + "/edit",
method: "put",
headers: { "X-CSRF-TOKEN": "${_csrf.token}" },
data: {
    id : answerId,
    body : body,
} });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM