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

Posted

技术标签:

【中文标题】Jquery POST在spring mvc中给出403禁止错误【英文标题】:Jquery POST giving 403 forbidden error in spring mvc 【发布时间】:2014-09-29 08:27:25 【问题描述】:

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

【问题讨论】:

你的应用服务器日志有错误吗? 不...我没有发现任何错误。 我正在登录日志:org.springframework.security.access.AccessDeniedException:访问被拒绝 403 表示服务器可以正确验证用户,但用户没有执行所选操作的适当权限。你在使用 Spring 安全性吗?如果有,贴出相关配置 我有类似的错误,但仍然没有解决***.com/questions/25800657/… 【参考方案1】:

使用带有 Java 配置的 Spring Security,默认情况下启用 CSRF 保护。 在这种情况下,如果您使用 POST 方法向 REST 端点发出 Ajax 请求,您将收到 csrf token missing 错误。

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

选项 1: 禁用 csrf

@Override
protected void configure (HttpSecurity http) throws Exception 
    http.csrf().disable();

选项 2: 将 csrf 添加到 ajax 请求中。见here

【讨论】:

@Override of configure 假设您的控制器是 what 类型/类的子类? org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter 的子类 这点你一定知道:- 16.3 什么时候使用CSRF 保护 什么时候应该使用CSRF 保护?我们的建议是对普通用户可以通过浏览器处理的任何请求使用 CSRF 保护。如果您只创建非浏览器客户端使用的服务,您可能希望禁用 CSRF 保护。 SRC:docs.spring.io/spring-security/site/docs/current/reference/html/… 看看这个:***.com/questions/27834867/… 了解如何通过 jquery-ajax 放置 csrf 令牌。 值得强调的是,不推荐使用选项 1,因为它可能有风险。【参考方案2】:

您可能希望将 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。

【讨论】:

【参考方案3】:

这是一个不禁用 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);
    
  )
);

【讨论】:

【参考方案4】:

如果您查看 CSRFilter 源代码,您会看到过滤器正在等待标头或查询参数上的 csrfToken。 在我的配置中,键“_csrf”是查询参数中的正确键。 所以,我在我的 post call 中添加了这个参数。

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

有了这个,它对我有用。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Jquery POST在spring mvc中给出403禁止错误的主要内容,如果未能解决你的问题,请参考以下文章

Jquery .ajaxForm() 提交给出 404 错误但 URL 正确 ASP.Net MVC

如何在 Spring MVC 中使用 AJAX 渲染视图

我们如何在 Spring MVC 中调用 requestmethod=POST?

405 - 请求方法“POST”不支持 Spring MVC + Spring Security

如何使用 Spring MVC 在 post 方法中传递 List<String>?

Spring MVC HTTP 状态 405 - 不支持请求方法“POST”