【问题标题】:Why Ajax headers property doesn't work but beforeSend event works in sending http headers to server?为什么 Ajax 标头属性不起作用但 beforeSend 事件在将 http 标头发送到服务器时起作用?
【发布时间】:2017-06-15 23:32:41
【问题描述】:

我使用@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 设置的值,而是继续使用一些旧的令牌值。

但是,在我将“标题”行切换到下面的行后,它会拾取我设置的令牌。

     beforeSend: function (request)
     {
       request.setRequestHeader("__RequestVerificationToken", token);
     },

为什么 headers 不起作用,但只有 beforeSend 起作用?到目前为止,我无法通过在线搜索找到任何线索。 标头是在 jQuery 1.5 中引入的,并且在文档中: https://api.jquery.com/jquery.ajax/

我正在使用 jQuery 1.11.1 和 .Net MVC 5.1。

【问题讨论】:

  • 您使用的form.serialize() 将包含令牌。根本不需要headers 选项。
  • 但这对我不起作用,服务器没有在请求标头中获取令牌,而且使用 ajax 的 headers 属性对我也不起作用
  • 如果你的@Html.AntiForgeryToken()在你的<form>标签内,那么.serialize()会序列化它。
  • 你是对的,它是序列化的,但是请求头没有得到它。
  • 你不需要在header中设置它:)它将被发送到body中的控制器

标签: ajax asp.net-mvc antiforgerytoken


【解决方案1】:

我在jQuery的setRequestHeader方法中设置了一个调试器,结果通过ajax调用多次调用:

第一个:

Content-Type "application/x-www-form-urlencoded; charset=UTF-8"

第二个:

Accept "*/*"

第三:

__RequestVerificationToken [the token I set]

但它也被称为第 4 次,也设置了 __RequestVerificationToken:

__RequestVerificationToken [some other token]

通过跟踪调用栈,我发现在我们的应用框架中有一个$.ajaxSetup方法

$.ajaxSetup({
    beforeSend: function (jqXHR, settings) {
    jqXHR.setRequestHeader("__RequestVerificationToken", environment.antiForgeryToken);
   }
});

那是覆盖我设置的令牌的罪魁祸首。通过在我的 ajax 调用中使用“beforeSend”,不会调用 ajaxSetup 中的“beforeSend”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多