我正在使用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调用,确实设置了标题...
任何人都可以告诉我发生了什么或最重要的,我该如何解决这个问题?
答案 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)
我发现问题是在旧版本的插件中缺少对文件上传的支持。当我删除文件输入时,问题就消失了。