Jquery,在ajax请求头中没有X-Requested-With=XMLHttpRequest?

Jquery,在ajax请求头中没有X-Requested-With=XMLHttpRequest?,jquery,Jquery,有时没有带标题的X-Requested-With,有时有 我查了firebug,发现了,不知道为什么 因此,当我在django中使用request.is_ajax时,它有时会失败 有人知道怎么修吗 好吧,现在又发生了。 我打开网页,然后离开去吃晚饭,有很长一段时间,当我回来时,事情又发生了。我在firbugs中记录了请求标头: 请求使用X-Request-with: 主机localhost:8000用户代理Mozilla/5.0(Windows;U;Windows NT 5.2;zh CN;r

有时没有带标题的X-Requested-With,有时有

我查了firebug,发现了,不知道为什么

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

有人知道怎么修吗


好吧,现在又发生了。 我打开网页,然后离开去吃晚饭,有很长一段时间,当我回来时,事情又发生了。我在firbugs中记录了请求标头:

请求使用X-Request-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
接受文本/html,/
接受语言zh cn,zh;q=0.5
接受编码gzip,放气
接受字符集GB2312,utf-8;q=0.7,*;q=0.7
保持活力300
使用XMLHttpRequest保持连接活动
X请求 Referer
http://localhost:8000/gallery/

Cookie xxx

不带X的请求-请求-带:

主机本地主机: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接受语言zh cn,zh;q=0.5接受编码gzip,放气
接受字符集GB2312,utf-8;q=0.7,*;q=0.7
保持活力300
连接保持活动状态
Referer
http://localhost:8000/gallery/

饼干xxx


提供更多信息。您提出了什么样的ajax请求

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

由于不能使用ajax提交文件,所有javascript框架都会在内部使用“隐藏iframe”技巧为您完成工作

用类似的问题和我的答案来检查这篇文章


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

来自jQuery源代码

xhr.setRequestHeader(“X-request-With”,“XMLHttpRequest”)


也可以尝试将X-request-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

公共静态类AjaxRequestExtensions
{
公共静态bool请求(此HttpRequestBase请求)
{
if(请求==null)
{
抛出新的ArgumentNullException(“请求”);
}
返回(请求[“X-request-With”]=“XMLHttpRequest”)||
((request.Headers!=null)和&(request.Headers[“X-request-With”]=“XMLHttpRequest”);
}
}
关于财产的MSDN文件 HttpRequestBase.Item属性
在派生类中重写时,从、或集合中获取指定的对象

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

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

这样,如果你把我的JXQuery Ajax调用中包含的<代码> XMLHypRestRebug < /Cord>键值对作为HTTP POST的一部分,ASP.NET MVC将把HTTP请求看作是Ajax HTTP请求。

我自己也有同样的问题,我通过确保在我的URL后面有一个尾部斜线来修复它。因此,不是:

$.get('/example/url')
使用:


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

我在1.6.2版中也遇到了这个问题,尤其是当页面设置为空闲一段时间时。扩展jitter的答案,这是在一个地方为每个请求添加冗余的X-request-With。我把这个放在我的主页上。希望这能奏效

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

我之所以这样做,是因为我获取了一个附加了AJAX事件处理程序的元素,对其进行克隆,然后将新元素添加到文档中。出于某种原因,这意味着附加到新元素的事件不会将其视为普通的ajax请求(接受:text/html而不是application/json、no X-Requested-With等)

为了解决这个问题,我所做的只是将事件更改为jQuery的新等价物
live()
(不确定他们现在叫它什么)。因此,来自:

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


这可能不是答案,但我花了几个小时才发现我的错误是非常愚蠢的。(让我头疼的是,它在我的开发盒上工作,但不是在生产中,我仍然不明白为什么会这样,但是…)

确保事件处理程序确实已连接!如果没有
X-request-With
标题,这可能是有充分理由的!我有一个表单,它的action属性是正确的url,我的提交按钮的“click”事件是说
event.preventDefault()
,然后调用
$.post(…)
,yadda-yadda。问题是,DOM元素被替换为其他一些xhr活动的结果,它的事件处理程序也被替换掉了。表单是作为普通的旧帖子提交的,而不是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 */);
});
进一步阅读:

我使用的是jquery.load(url)方法,以前使用其他方法时也遇到过这个问题。当这个问题发生时,我试图触发
$('#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 */);
});