【发布时间】:2015-09-19 19:06:38
【问题描述】:
我需要将字符串(或字符串数组)作为 JSON 对象发送到服务器,但如果我添加 csrf 参数+令牌,我会不断收到 405 Method not allowed 或 Bad request。
这就是我想要做的:
var data = { 'info': $('#theData').html() }; // data is: <p> bla <strong>bla</strong> bla </p>
$.ajax({
type: 'POST',
contentType : 'application/json',
dataType : 'json',
url: "editInfo", // ?${_csrf.parameterName}=${_csrf.token}", // `Bad Request`
data: JSON.stringify(data),
success: function(data){
$('#responseMsg').html('YES!').show(200);
},
error: function(el) {
var msg = 'Error ' + el.status + ': ' + el.statusText;
$('#responseMsg').html(msg).show(200);
}
});
这是控制器:
@RequestMapping(value="editInfo", method = RequestMethod.POST, headers ="content-type=application/json")
public @ResponseBody String editInfo(
@RequestBody Info info,
HttpServletRequest request) {
// do stuff
return "success";
}
Info 类只有 1 个名为 info 的字符串及其 getter 和 setter。理想情况下,我只想捕获 String 或 String 数组,但无论如何都没有得到 405 Method not allowed
【问题讨论】:
-
嗯,一切看起来都很好,我无法重现 - 添加 CSRF 令牌后,您的网址会是什么样子?如果您设置静态参数(例如 url: "editInfo?param1=csrf_token"),您会得到 405 吗?
-
天哪,它有效!我添加了 CSRF,但我不再得到
Bad request,可能是因为控制器中的headers在我尝试使用 CSRF 时没有。要回答您的问题,URL 如下所示:/editInfo?_csrf=8b1c698f-8086-4c3f-8d2e-913ebf93aff7 -
@pzeszko 你可以添加一个回复,我会把它作为正确答案=)
-
谢谢,不过,我认为您不需要在控制器方法中设置标题 - 它应该可以在没有它的情况下工作。
-
你说得对,没有
headers也可以工作...所以我不知道为什么它以前不能工作...
标签: jquery json ajax spring-mvc