问题描述
这是我的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被禁止。
救命。
1楼
似乎无法识别PUT请求主体中的CSRF令牌(Servlet容器不会从PUT请求主体生成参数映射)。
但是您可以将其作为发送:
$.ajax({
url: "/questions/" + _questionId + "/answers/" + answerId + "/edit",
method: "put",
headers: { "${_csrf.parameterName}": "${_csrf.token}" },
data: {
id : answerId,
body : body,
}
});
2楼
查看此链接: : 。
我遇到了类似的问题。
如果我使用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,
} });