Spring Security CSRF Token not working with AJAX
我的spring boot应用程序中使用csrf令牌有问题。
我有一个可以编辑个人的表格。一个人可以拥有
现在让我们想象这个人有一辆汽车,然后进入并存储它。下次他要删除这辆车并输入另一辆车时。我创建了这个列表,以便有一个他所有汽车的列表-他可以选择将其从列表中删除。现在,我将从这些药开始,并希望将具有相应ID的POST发送到服务器。当我尝试时,我被禁止使用403,我也不知道为什么。
如果我从POST更改为GET,则可以使用。
我的JavaScript(来自此网站:http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#the-csrfmetatags-tag) 我的控制器方法: 有什么建议吗?
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var csrfHeader = $("meta[name='_csrf_header']").attr("content");
var csrfToken = $("meta[name='_csrf']").attr("content");
// using JQuery to send a non-x-www-form-urlencoded request
var headers = {};
headers[csrfHeader] = csrfToken;
$.ajax({
url:"./delete/car",
type:"GET",
headers: headers,
});
$.ajax({
url:"./delete/car",
type:"POST",
headers: headers,
});
2
3
4
5
6
7
8
9
10
11
public ModelAndView delete(@PathVariable("login") final String login) {
System.out.println("Stop");
return new ModelAndView("redirect:" + WebSecurityConfig.URL_PERSONS_OVERVIEW);
}
@RequestMapping(value ="/{login}/delete/car", method = RequestMethod.POST)
public ModelAndView deleteInstEmp(@PathVariable("login") final String login) {
System.out.println("Stop");
return new ModelAndView("redirect:" + WebSecurityConfig.URL_PERSONS_OVERVIEW);
}
预先感谢。
好的,经过所有这些努力之后,我得到了以下结果。
我将
"Failed to execute 'setRequestHeader' on 'XMLHttpRequest': '${_csrf.headerName}' is not a valid HTTP header field name."
spring官方网站建议您必须在HTML文件中添加以下内容:
此后,您应该能够在JavaScript中访问这些属性,但是在我的情况下,我会得到
最后一次尝试是从隐藏值中获取值(第24.5章:http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/# -csrfmetatags标签)。
现在,我有以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $(function () { var token = $("input[name='_csrf']").val(); var header ="X-CSRF-TOKEN"; $(document).ajaxSend(function(e, xhr, options) { xhr.setRequestHeader(header, token); }); }); $.ajax({ url:"./delete/car", type:"POST", success:function(response) { alert(response); } }); |
以此为工作原理。
另一种方法,您可以使用以下代码:
1 2 3 4 5 6 7 8 | $.ajax({ url : './delete/car', headers: {"X-CSRF-TOKEN": $("input[name='_csrf']").val()}, type : 'POST', success : function(result) { alert(result.msgDetail); } }) |
我建议您首先检查是否使用chrome调试器生成了有效的csrf令牌和标头。如果不是,那么是否在
如果令牌不为空,则在安全性上下文/配置文件中,检查是否有机会禁用了csrf安全性。默认情况下,它是启用的,并且需要此过程才能起作用。