我想使用$ .POST进行ajax调用。但我得到403错误。但GET工作得非常好。我的代码是:
var url = "/xyz/abc/subscribe?name="+name;
$.post(url, function(data){
alert(data);
});
控制器代码为:
@RequestMapping(value = "/xyz/abc/subscribe", method = RequestMethod.POST)
public @ResponseBody
String subscribe(@RequestParam("name") String name)
throws Exception {
String message = "TESTING";
return message;
}
但我收到403错误。
答案 0 :(得分:75)
使用Spring Security with Java配置,默认情况下启用CSRF保护。 在此上下文中,如果使用POST方法向REST端点发出Ajax请求,则会出现csrf令牌丢失错误。
要解决此问题,有两种选择:
选项1:禁用csrf
@Override
protected void configure (HttpSecurity http) throws Exception {
http.csrf().disable();
}
选项2:将csrf添加到ajax请求中。见here
答案 1 :(得分:8)
您可能希望将csrf标记添加到请求中。
使用JSTL获取令牌应该非常简单。如果你正在使用Thymeleaf,这里是如何获得它。
<script th:inline="javascript">
/*<![CDATA[*/
var _csrf_token = /*[[${_csrf.token}]]*/ '';
var _csrf_param_name = /*[[${_csrf.parameterName}]]*/ '';
/*]]>*/
</script>
然后,将其添加到您的请求中:
var requestData = {
'paramA': paramA,
'paramB': paramB,
};
requestData[_csrf_param_name] = _csrf_token; // Adds the token
$.ajax({
type: 'POST',
url: '...your url...',
data: requestData,
...
});
如果一切顺利,请求应包含类似的内容 _csrf:1556bced-b323-4a23-ba1d-5d15428d29fa(csrf令牌),你将获得200而不是403.
答案 2 :(得分:1)
这是不禁用CSRF的示例。
第1步:在标题中添加这样的CSRF
<meta th:name="${_csrf.parameterName}" th:content="${_csrf.token}"/>
步骤2:使用令牌拨打电话
$( "#create_something" ).click(function() {
var token = $("meta[name='_csrf']").attr("content");
$.ajax({
url : '/xxxxxxxxxxxx', // url to make request
headers: {"X-CSRF-TOKEN": token}, //send CSRF token in header
type : 'POST',
success : function(result) {
alert(result);
}
})
});
答案 3 :(得分:0)
如果查看CSRFilter源代码,您将看到过滤器正在等待header或query参数上的csrfToken。 在我的配置中,键“_csrf”是查询参数中的右键。 所以,我在我的帖子中添加了这个参数。
var csrfCookie = getCsrfCookie();
alert(csrfCookie);
function getCsrfCookie()
{
var ret = "";
var tab = document.cookie.split(";");
if(tab.length>0){
var tab1 = tab[0].split("=");
if(tab1.length>1)
{
ret =tab1[1];
}
}
return ret;
}
$http.post('/testPost?_csrf='+csrfCookie).success(function (response) {
alert("post : "+response);
return response;
});
有了它,它对我有用。
答案 4 :(得分:-3)
您正在尝试向您未获授权的REST端点发出POST请求。您的会话已无效,或您登录的用户没有像@geo已经指出的权限。