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

use*_*782 21 jquery post spring-mvc http-status-code-403

我想使用$ .POST进行ajax调用.但我得到403错误.但GET工作得非常好.我的代码是:

var url = "/xyz/abc/subscribe?name="+name;
$.post(url, function(data){
    alert(data);
});
Run Code Online (Sandbox Code Playgroud)

控制器代码是:

@RequestMapping(value = "/xyz/abc/subscribe", method = RequestMethod.POST)
public @ResponseBody
    String subscribe(@RequestParam("name") String name)
        throws Exception {
    String message = "TESTING";
    return message;
}
Run Code Online (Sandbox Code Playgroud)

但是我收到403错误.

Emi*_*ano 81

使用Spring Security with Java配置,默认情况下启用CSRF保护.在此上下文中,如果使用POST方法向REST端点发出Ajax请求,则会出现csrf令牌丢失错误.

要解决这个问题,有两种选择:

选项1:禁用csrf

@Override
protected void configure (HttpSecurity http) throws Exception {
    http.csrf().disable();
}
Run Code Online (Sandbox Code Playgroud)

选项2:将csrf添加到ajax请求中.看到这里

  • 值得强调的是,不建议使用选项1.,因为它可能会带来风险。 (2认同)

izi*_*tti 8

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

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

<script th:inline="javascript">
    /*<![CDATA[*/
    var _csrf_token = /*[[${_csrf.token}]]*/ '';
    var _csrf_param_name = /*[[${_csrf.parameterName}]]*/ '';
    /*]]>*/
</script>
Run Code Online (Sandbox Code Playgroud)

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

var requestData = {
    'paramA': paramA,
    'paramB': paramB,
};
requestData[_csrf_param_name] = _csrf_token; // Adds the token

$.ajax({
    type: 'POST',
    url: '...your url...',
    data: requestData,
    ...
});
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,请求应该包括类似_csrf:1556bced-b323-4a23-ba1d-5d15428d29fa(csrf令牌),你将得到200而不是403.


VK3*_*321 5

这是一个没有禁用 CSRF 的例子。

第 1 步:在您的标头中添加 CSRF,如下所示

<meta th:name="${_csrf.parameterName}" th:content="${_csrf.token}"/>
Run Code Online (Sandbox Code Playgroud)

第 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);
    }
  })
});
Run Code Online (Sandbox Code Playgroud)


Pat*_*ard -3

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