Spring CSRF:Ajax即使在设置请求标头后也会出现403错误

时间:2018-01-21 04:55:31

标签: java ajax spring-mvc spring-security csrf

我使用Spring Security 4.0设置了CSRF身份验证。使用AJAX时,我每次都会收到403错误。我已经设置了请求标头。

元标记:

_mm_cmple_ps

AJAX看起来像这样:

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head>
<meta name="_csrf" th:content="${_csrf.token}"/>
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>

我可以在ajax请求中看到请求标头:

var token = $("meta[name='_csrf']").attr("th:content");
var header = $("meta[name='_csrf_header']").attr("th:content");



$.ajax({
type : "POST",
url : "/PRIT/Home/PopulateVisits",
async: false,
beforeSend: function(xhr) {
   if (header && token) {
      xhr.setRequestHeader(header, token);
   }
},
.
.
.

我不确定出了什么问题。永远不会访问请求的控制器。控制器是这样的:

> Accept:*/* Accept-Encoding:gzip, deflate, br
> Accept-Language:en-US,en;q=0.9 Cache-Control:no-cache
> Connection:keep-alive Content-Length:9
> Content-Type:application/x-www-form-urlencoded; charset=UTF-8
> Cookie:JSESSIONID=C3CAAD64269BD0B96FF35B87053B5899 Host:localhost:8082
> Origin:http://localhost:8082 Pragma:no-cache
> Referer:http://localhost:8082/PRIT/Login User-Agent:Mozilla/5.0
> (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
> Chrome/63.0.3239.132 Safari/537.36
> X-CSRF-TOKEN:23c07d26-0494-4588-a158-624791258762
> X-Requested-With:XMLHttpRequest


Request URL:http://localhost:8082/PRIT/Home/PopulateVisits
Request Method:POST
Status Code:403 
Remote Address:[::1]:8082
Referrer Policy:no-referrer-when-downgrade

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,在我的情况下,我在登录期间使春季会话无效。在您尝试访问的请求之前,请确保您没有在控制器中的任何位置使Spring会话无效。 Spring将令牌与会话相关联,使其无效会产生新的令牌。