Jquery,No X-Requested-With = ajax请求头中的XMLHttpRequest?

时间:2009-12-11 04:50:41

标签: jquery

有些时候没有X-Requested-With标头,有时会有。

我检查了萤火虫并发现了,不知道为什么。

因此,当我在django中使用request.is_ajax时,它有时会失败。

任何人都知道如何修复它?


好的,现在又发生了。 我打开页面然后离开了很长一段时间的晚餐,当我回来时,又发生了一次。我在firbugs中记录了请求标题:

请求X-Requested-with:

  

主机localhost:8000用户代理Mozilla / 5.0(Windows; U; Windows   NT 5.2; ZH-CN; rv:1.9.1.5)Gecko / 20091102
Firefox / 3.5.5
  接受text / html, /
Accept-Language zh-cn,zh; q = 0.5
  接受编码gzip,deflate
  Accept-Charset GB2312,utf-8; q = 0.7,*; q = 0.7
Keep-Alive 300
  连接保持活动的X-Requested-With XMLHttpRequest
  引用者http://localhost:8000/gallery/
Cookie xxx

请求没有X-Requested-with:

  

主机localhost:8000
  用户代理Mozilla / 5.0(Windows; U;   Windows NT 5.2; ZH-CN; RV:1.9.1.5)   Gecko / 20091102
Firefox / 3.5.5   接受text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8 Accept-Language zh-cn,zh; q = 0.5 Accept-Encoding gzip,deflate <登记/>   Accept-Charset GB2312,utf-8; q = 0.7,*; q = 0.7
Keep-Alive 300
  连接保持活着
  参考者http://localhost:8000/gallery/
  Cookie xxx

6 个答案:

答案 0 :(得分:8)

提供更多信息。你在做什么样的ajax请求?

如果您要提交的表单包含类型为file的输入字段,则很可能是缺少标题的原因。

由于您无法使用ajax提交文件,因此所有javascript框架都会在内部使用“隐藏的iframe”技巧来完成工作。

查看此帖子时遇到类似问题及其答案。

X-Requested-With header not set in jquery ajaxForm plugin


否则jQuery不应该有这样的行为,因为它始终设置头。如果问题与文件输入无关,请发布相关的codesnippets

  来自jQuery Source

     

xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

答案 1 :(得分:8)

我在版本1.6.2中遇到了这个问题,特别是当页面空闲了一段时间。扩展抖动的答案,这就是在一个地方为每个请求多次添加X-Requested-With。我把它放在我的母版页面中。希望这会成功。

$(document).ajaxSend(function (event, request, settings) {
    request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
});

答案 2 :(得分:0)

尝试将 X-Requested-With 作为Post值的一部分。

var postData = "X-Requested-With=XMLHttpRequest&" + $("#myFormId").serialize();
$.post(
    'http://www.mysite.com/blahblah',
    postData,
    function(data) { /*do whatever*/ },
    'html'
);

将其与jitter's answer合并。希望它有所帮助!

编辑说明:

我很抱歉,我不知道自己在想什么。我发布时一定是误读了这个问题 这个问题适用于 Python django 框架。不适用于ASP.NET MVC。

我发布了这个答案,因为ASP.NET MVC的行为基于以下源代码。

ASP.NET MVC源代码

查看ASP.NET MVC源代码中的 AjaxRequestExtensions.cs 类。 http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/60c2f18ed84838b1b3da671536a7a40033e67b0d#src/System.Web.Mvc/AjaxRequestExtensions.cs

public static class AjaxRequestExtensions
{
  public static bool IsAjaxRequest(this HttpRequestBase request)
  {
      if (request == null)
      {
          throw new ArgumentNullException("request");
      }

      return (request["X-Requested-With"] == "XMLHttpRequest") ||
             ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest"));
  }
}

HttpRequestBase.Item属性

上的MSDN文档
  

HttpRequestBase.Item属性
  在派生类中重写时,从CookiesFormQueryStringServerVariables集合中获取指定的对象。

因此,request["X-Requested-With"]将在以下所有位置查找该密钥:

  • HTTP表单POST值
  • HTTP Cookie
  • HTTP请求查询字符串
  • 和服务器变量。

因此,如果您将X-Requested-With=XMLHttpRequest键值对包含在HTTP POST中,就像我在jQuery AJAX调用中那样,ASP.NET MVC会将HTTP请求视为AJAX HTTP请求。< / p>

答案 3 :(得分:0)

我自己也遇到了同样的问题,我通过确保在我的网址后面有一个尾随斜线来修复它。所以而不是:

$.get('/example/url')

使用:

$.get('example/url/')

看起来已经有一段时间了,因为你发布了这个但也许会有所帮助!

答案 4 :(得分:0)

我得到这个的原因是因为我正在使用附加了我的AJAX事件处理程序的元素,克隆它然后将新元素添加到我的文档中。由于某种原因,这意味着附加到新元素的事件不会将其视为正常的ajax请求(接受:text / html而不是application / json,没有X-Requested-With等。)

要解决这个问题,我所做的就是将事件更改为jQuery的新等效live()(不确定他们现在称之为什么)。所以来自:

$('a.basket-add').click(function() { /* etc */ });

要:

$(document).on('click', '.basket-add', function() { /* etc */ });

答案 5 :(得分:0)

这可能不是答案,但是在弄清楚我的错误是非常愚蠢之前,我抓住了我的眼球几个小时。 (杀了我的是,它正在我的开发盒上工作,但没有投入生产,我仍然不明白为什么会这样,但是......)

确保事件处理程序真正附加!如果没有X-Requested-With标题,那可能是有充分理由的!我有一个表单,其action属性是正确的url,我的提交按钮的“click”事件是event.preventDefault(),然后调用$.post(...),yadda yadda。问题是,DOM元素被替换为其他一些xhr活动的结果,并且它的事件处理程序正在被它吹走。该表单是作为一个普通的POST提交的,而不是ajax,因此没有标题。

所以,而不是

$('#my-submit-button').on("click", data, function(event) {
    event.preventDefault();
    $.post(/* etc */);
})

它需要像

$('#parent-div').on("click","#my-submit-button", function(event){
    event.preventDefault();
    $.post(/* etc */);
});

进一步阅读:https://learn.jquery.com/events/event-delegation/