有些时候没有X-Requested-With标头,有时会有。
我检查了萤火虫并发现了,不知道为什么。
因此,当我在django中使用request.is_ajax时,它有时会失败。
任何人都知道如何修复它?
请求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, /
Accept-Language zh-cn,zh; q = 0.5
接受编码gzip,deflate
Accept-Charset GB2312,utf-8; q = 0.7,*; q = 0.7
Keep-Alive 300
连接保持活动的X-Requested-With XMLHttpRequest
引用者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
连接保持活着
参考者http://localhost:8000/gallery/
Cookie xxx
答案 0 :(得分:8)
提供更多信息。你在做什么样的ajax请求?
如果您要提交的表单包含类型为file的输入字段,则很可能是缺少标题的原因。
由于您无法使用ajax提交文件,因此所有javascript框架都会在内部使用“隐藏的iframe”技巧来完成工作。
查看此帖子时遇到类似问题及其答案。
X-Requested-With header not set in jquery ajaxForm plugin
否则jQuery不应该有这样的行为,因为它始终设置头。如果问题与文件输入无关,请发布相关的codesnippets
来自jQuery Source
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
答案 1 :(得分:8)
我在版本1.6.2中遇到了这个问题,特别是当页面空闲了一段时间。扩展抖动的答案,这就是在一个地方为每个请求多次添加X-Requested-With。我把它放在我的母版页面中。希望这会成功。
$(document).ajaxSend(function (event, request, settings) {
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
});
答案 2 :(得分:0)
尝试将 X-Requested-With 作为Post值的一部分。
var postData = "X-Requested-With=XMLHttpRequest&" + $("#myFormId").serialize();
$.post(
'http://www.mysite.com/blahblah',
postData,
function(data) { /*do whatever*/ },
'html'
);
将其与jitter's answer合并。希望它有所帮助!
我发布了这个答案,因为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属性
在派生类中重写时,从Cookies,Form,QueryString或ServerVariables集合中获取指定的对象。
因此,request["X-Requested-With"]
将在以下所有位置查找该密钥:
因此,如果您将X-Requested-With=XMLHttpRequest
键值对包含在HTTP POST中,就像我在jQuery AJAX调用中那样,ASP.NET MVC会将HTTP请求视为AJAX HTTP请求。< / p>
答案 3 :(得分:0)
我自己也遇到了同样的问题,我通过确保在我的网址后面有一个尾随斜线来修复它。所以而不是:
$.get('/example/url')
使用:
$.get('example/url/')
看起来已经有一段时间了,因为你发布了这个但也许会有所帮助!
答案 4 :(得分:0)
我得到这个的原因是因为我正在使用附加了我的AJAX事件处理程序的元素,克隆它然后将新元素添加到我的文档中。由于某种原因,这意味着附加到新元素的事件不会将其视为正常的ajax请求(接受:text / html而不是application / json,没有X-Requested-With等。)
要解决这个问题,我所做的就是将事件更改为jQuery的新等效live()
(不确定他们现在称之为什么)。所以来自:
$('a.basket-add').click(function() { /* etc */ });
要:
$(document).on('click', '.basket-add', function() { /* etc */ });
答案 5 :(得分:0)
这可能不是答案,但是在弄清楚我的错误是非常愚蠢之前,我抓住了我的眼球几个小时。 (杀了我的是,它正在我的开发盒上工作,但没有投入生产,我仍然不明白为什么会这样,但是......)
确保事件处理程序真正附加!如果没有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 */);
});