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

我正在使用jQuery ajaxForms插件将ajax提交到我的CakePHP应用程序。

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

我尝试了几件事,

在主要的onloadfunction中我补充说:

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

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

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

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

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

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

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

AFAIK你可以将这些数据传递给options对象中的ajaxForms插件

 $('#myForm1').ajaxForm({data:{"X_REQUESTED_WITH":"XMLHttpRequest"}}); 

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

  

新发展:

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

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

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

由于我的表单是带有文件上传的多部分,插件使用iFrametechnique而不是常规的ajax调用…

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

我今天刚刚处理了与此类似的问题,并提出了一个不同的解决方案。 问题出现在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函数时不要设置此标头。 希望这能解决某些人的头痛问题。

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