我使用@ Html.AntiForgeryToken()来装饰表单并尝试在ajax调用中发送令牌,在开始时我使用了以下代码:
var token = $('input[name="__RequestVerificationToken"]', form).val();
$.ajax({
type: "POST",
url: newurl,
headers: {'__RequestVerificationToken': token},
data: form.serialize(),
datatype: "JSON",
success: function..,
error: function..
})
它没有用,服务器没有获得我在__RequestVerificationToken的上述标题中设置的值,但保持使用一些旧的标记值。
然而,在我切换"标题后#34;在下面的一行中,它选择了我设置的令牌。
beforeSend: function (request)
{
request.setRequestHeader("__RequestVerificationToken", token);
},
标题怎么做不起作用,但只有在发送之前?到目前为止,我无法通过在线搜索找到任何线索。 Headers是在jQuery 1.5中引入的,并且在文档中: https://api.jquery.com/jquery.ajax/
我使用的是jQuery 1.11.1和.Net MVC 5.1。
答案 0 :(得分:0)
我在jQuery的setRequestHeader方法中设置了一个调试器,结果发现它是通过ajax调用多次调用的:
第一名:
Content-Type "application/x-www-form-urlencoded; charset=UTF-8"
第二名:
Accept "*/*"
第三
__RequestVerificationToken [the token I set]
但它也被称为第四次,也设置了__RequestVerificationToken:
__RequestVerificationToken [some other token]
通过跟踪调用堆栈,我发现在我们的应用程序框架中有一个$ .ajaxSetup方法
$.ajaxSetup({
beforeSend: function (jqXHR, settings) {
jqXHR.setRequestHeader("__RequestVerificationToken", environment.antiForgeryToken);
}
});
这是覆盖我设置的令牌的罪魁祸首。使用' beforeSend'在我的ajax电话中,' beforeSend'在ajaxSetup中没有被调用。