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

有些时候没有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
火狐/ 3.5.5
接受text / html, /
Accept-Language zh-cn,zh; q = 0.5
接受编码gzip,收缩
Accept-Charset GB2312,utf-8; q = 0.7,*; q = 0.7
Keep-Alive 300
连接保持活着
X-Requested-With XMLHttpRequest
Referer 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
连接保持活着
Referer http://localhost:8000/gallery/
Cookie xxx

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

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

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

检查此帖有类似的问题和我的答案。

X-Requested-With标头未在jquery ajaxForm插件中设置


否则,jQuery不应该有这样的行为,因为它总是设置头。 如果问题与文件输入无关,请发布相关的代码片段

来自jQuery Source

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

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

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

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

 $.get('/example/url') 

使用:

 $.get('example/url/') 

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

通过将X-Requested-With包含在Post值中,也可以尝试这一点。

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

那并将它与抖动的答案结合起来。 希望能帮助到你!

编辑说明:

我道歉,我不知道我在想什么。 我发布时一定是误读了这个问题。
这个问题适用于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属性
在派生类中重写时,从Cookies , Form , QueryString或ServerVariables集合中获取指定的对象。

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

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

因此,如果您将X-Requested-With=XMLHttpRequest键值对作为HTTP POST的一部分包含在jQuery AJAX调用中,那么ASP.NET MVC会将HTTP请求视为AJAX HTTP请求。

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

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

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

至:

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

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

确保事件处理程序真正附加! 如果没有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/