Jquery POST在spring mvc中给403禁止错误

时间:2014-08-06 11:55:03

标签: jquery spring-mvc post http-status-code-403

我想使用$ .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错误。

5 个答案:

答案 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已经指出的权限。