Spring CSRF:即使在设置请求标头后,Ajax 也会出现 403 错误
Posted
技术标签:
【中文标题】Spring CSRF:即使在设置请求标头后,Ajax 也会出现 403 错误【英文标题】:Spring CSRF: Ajax giving 403 error even after setting request headers 【发布时间】:2018-06-30 00:51:15 【问题描述】:我已经使用 Spring Security 4.0 设置了 CSRF 身份验证。在使用 AJAX 时,我每次都会收到 403 错误。我已经设置了请求标头。
元标记:
<!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);
,
.
.
.
我可以在 ajax 请求中看到请求标头:
> 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
我不确定出了什么问题。请求的控制器永远不会被访问。控制器是这样的:
@RequestMapping(value = "/Home/PopulateVisits", method = RequestMethod.POST)
public @ResponseBody List<DataCollectionForm> PopulateVisits(DataCollectionForm dataCollectionForm, HttpServletRequest request)
【问题讨论】:
【参考方案1】:我遇到了类似的问题,在我的情况下,我在登录期间使 Spring 会话无效。在您尝试访问请求之前,请确保您没有使控制器中的任何地方的 Spring 会话无效。 Spring 将令牌与会话相关联,使其无效将产生一个新令牌。
【讨论】:
以上是关于Spring CSRF:即使在设置请求标头后,Ajax 也会出现 403 错误的主要内容,如果未能解决你的问题,请参考以下文章
即使设置了标头,也无法验证 CSRF 令牌的真实性 Rails 4 Ajax
Spring MVC 4 AngularJS 1.3 HTTP POST 具有空 CSRF 令牌或标头
Spring Security 的 POST 响应标头中未设置 Angular 2 CSRF cookie
即使禁用 csrf,Spring Boot 也会为移动请求抛出 403