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

时间:2009-12-04 12:30:52

标签: javascript jquery ajax

我正在使用jQuery ajaxForms plugin向我的CakePHP应用程序提交ajax提交。

Cake的RequestHandler通过查看“X-Requested-With”标头来检测ajax请求,但表单插件似乎没有设置它。或者jQuery在使用插件时没有设置它。

我尝试过几件事,

在我添加的主要onload函数中:

$.ajaxSetup({
    headers: {"X-Requested-With":"XMLHttpRequest"}
});

在插件代码中,我在实际的ajax调用之前添加了这个:

options.beforeSend = function(xhr) {
    xhr.setRequestHeader("X_REQUESTED_WITH", "XMLHttpRequest");
};

进行常规的ajax调用,确实设置了标题...

任何人都可以告诉我发生了什么或最重要的,我该如何解决这个问题?

5 个答案:

答案 0 :(得分:12)

@Nicky De Maeyer回答他自己的问题

实际上你自己不需要这样做(附加一个隐藏的输入字段)。

AFAIK你可以将这些数据传递给选项对象

中的ajaxForms插件
$('#myForm1').ajaxForm({data:{"X_REQUESTED_WITH":"XMLHttpRequest"}});

应自动(在隐藏的iframe文件上传案例中)在提交时向表单附加此类输入

<input type="hidden" name="X_REQUESTED_WITH" value="XMLHttpRequest" />

答案 1 :(得分:3)

新发展:

截至目前,jquery.form plugin现在支持多部分(包括文件)上传,以跨浏览器兼容的方式,并设置X-Requested-With标头。我用旧版本的jquery.form遇到了这个问题,升级到3.02修复了它!

答案 2 :(得分:2)

根据petersendidit的评论,我去寻找ajax /文件上传问题。

SO上有一个有趣的问题,说它不可能,只能通过一个带有iFrame的黑客攻击。所以没有真正的ajax调用......

因为我的表单是带有文件上传的多部分,所以插件使用iFrame技术而不是常规的ajax调用...

要解决此问题,要知道这应该类似于ajax调用,我将在多部分表单上添加一个隐藏的输入字段......

答案 3 :(得分:0)

我今天只需处理与此类似的问题,并提出了一个不同的解决方案。问题出现在Chrome,Safari和IE上,其标题(我通过$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'检查PHP)不匹配。

正如前面的回答所述,当使用jQuery ajax函数时,这个头文件已经由jQuery设置了。

在上述浏览器中,使用时:

options.beforeSend = function(xhr) {
    xhr.setRequestHeader("X_REQUESTED_WITH", "XMLHttpRequest");
};

那些浏览器(不是Firefox)会将其附加到标题中。所以实际上,标题设置为:'XMLHttpRequest,XMLHttpRequest'

底线,在使用jquery AJAX函数时不要设置此标头。希望这能解决某些人的头痛问题。

答案 4 :(得分:0)

我发现问题是在旧版本的插件中缺少对文件上传的支持。当我删除文件输入时,问题就消失了。