Man*_* Zi 7 java ajax spring spring-mvc csrf
我在使用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)
var csrfParameter = $("meta[name='_csrf_parameter']").attr("content");
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,
});
Run Code Online (Sandbox Code Playgroud)
我的控制器方法:
@RequestMapping(value = "/{login}/delete/car", method = RequestMethod.GET)
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);
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
提前致谢.
Man*_* Zi 18
好吧,在经历了这一切之后,我得到了以下结果.
我将fail方法添加到Ajax构造并获取以下消息:
"无法在'XMLHttpRequest'上执行'setRequestHeader':'$ {_ csrf.headerName}'不是有效的HTTP头字段名称."
官方的春季网站建议你必须把这个:<sec:csrfMetaTags />或者来自其他来源,这个:<meta name="_csrf" th:content="${_csrf.token}"/>在你的html文件中.
在这之后,你应该能够在你的JavaScript访问这些属性,但对我来说,我得到undefined和${_csrf.headerName}.
最后一次尝试是从隐藏值中获取值(第24.5章:http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#the-csrfmetatags -tag).
现在,我有以下内容:
$(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);
}
});
Run Code Online (Sandbox Code Playgroud)
有了它,它就像一个魅力.
| 归档时间: |
|
| 查看次数: |
14694 次 |
| 最近记录: |