Jquery POST在spring mvc中给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错误。

使用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请求中。 看到这里

您可能希望将csrf标记添加到请求中。

使用JSTL获取令牌应该非常简单。 如果你正在使用Thymeleaf,这里是如何获得它。

  

然后,将其添加到您的请求中:

 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。

如果查看CSRFilter源代码,您将看到filter正在等待header或query参数上的csrfToken。 在我的配置中,键“_csrf”是查询参数中的右键。 所以,我在post调用中添加了这个参数。

  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; }); 

您正在尝试向您未授权的REST端点发出POST请求。 您的会话已变为无效,或者您正在登录的用户没有像@geo已经指出的权限。