CSRF令牌无效' null'当我使用PUT方法与Spring Security

时间:2015-08-07 10:15:05

标签: java spring

这是我的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());
}

和Controller是PUT方法

当我尝试使用POST方法时,它可以正常工作。 但我只是改变方法(PUT)服务器和客户端。 CSRF令牌无效' null'在broswer控制台禁止403。

帮助。

2 个答案:

答案 0 :(得分:0)

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

但您可以将其发送为HTTP header

JSON.stringify(data[key].empid)

答案 1 :(得分:0)

点击此链接: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,
} });