为什么Ajax头属性不起作用,但beforeSend事件在向服务器发送http头时有效?

时间:2017-06-15 15:15:55

标签: ajax asp.net-mvc antiforgerytoken

我使用@ 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。

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中没有被调用。