Jquery, No X-Requested-With = XMLHttpRequest в заголовке запроса ajax?

НЕКОТОРЫЕ ВРЕМЯ нет заголовка X-Requested-With, иногда есть.

Я проверил в firebug и обнаружил, что не знаю почему.

Поэтому, когда я использую request.is_ajax в django, иногда это прерывается.

Кто-нибудь знает, как это исправить?


ОК, теперь это случилось снова. Я открыл страницу, а затем ушел на ужин долгое время, когда я вернулся, это случилось снова. Я записал заголовок запроса в firbugs:

Запрос с X-Requested-with:

Host localhost: 8000
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.2; ZH-CN; rv: 1.9.1.5) Gecko/20091102
Firefox/3.5.5
Accept text/html,/
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
Подключение keep-alive
X-Requested-с XMLHttpRequest
Referer http://localhost:8000/gallery/
Cookie xxx

Запрос без X-Requested-with:

Host localhost: 8000
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.2; ZH-CN; с.в.: 1.9.1.5) Gecko/20091102
Firefox/3.5.5 Принять текст /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
Соединение keep-alive
Referer http://localhost:8000/gallery/
Cookie xxx

Ответы

Ответ 1

Предоставьте дополнительную информацию. Какие запросы ajax вы делаете?

Если вы отправляете формы, которые содержат поле ввода файла типа, что, скорее всего, является причиной отсутствия заголовка.

Поскольку вы не можете отправить файл с помощью ajax, все фреймворки javascript используют встроенный трюк "скрытый iframe", чтобы выполнить работу для вас.

Проверьте этот пост с аналогичной проблемой и моим ответом на него.

X-Requested-С заголовком, не установленным в jQuery плагине ajaxForm


В противном случае не должно быть причин для такого поведения из jQuery, поскольку он всегда устанавливает заголовок. Если проблема не связана с файловыми входами, разместите соответствующие коды.

из источника jQuery

xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

Ответ 2

Я столкнулся с этой проблемой, а также с версией 1.6.2, особенно, когда страница некоторое время была бездействующей. Расширяя ответ на дрожание, это добавляет X-Requested-With избыточно для каждого запроса в одном месте. Я помещаю это на свою главную страницу. Надеюсь, это сработает.

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

Ответ 3

Попробуйте также включить 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. Надеюсь, это поможет!

ИЗМЕНИТЬ ПРИМЕЧАНИЯ:

Прошу прощения, я не знаю, о чем я думал. Я, должно быть, неправильно понял вопрос, когда я опубликовал. Этот вопрос предназначен для рамки Python django. Не для ASP.NET MVC.

Я опубликовал этот ответ из-за поведения ASP.NET MVC на основе следующего исходного кода.

Исходный код ASP.NET MVC

Посмотрите на класс AjaxRequestExtensions.cs в источнике ASP.NET MVC. 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"));
  }
}

Документация MSDN на HttpRequestBase.Item Свойство

Свойство HttpRequestBase.Item
При переопределении в производном классе получает указанный объект из Cookies, Form, QueryString или ServerVariables.

Следовательно, request["X-Requested-With"] будет искать этот ключ во всех следующих местах:

  • HTTP POST-значения формы
  • HTTP Cookie
  • Строка запроса HTTP-запроса
  • и серверные переменные.

Итак, если вы включаете пару ключ-значение X-Requested-With=XMLHttpRequest как часть HTTP POST, как я делаю в вызове jQuery AJAX, ASP.NET MVC рассмотрит HTTP-запрос как HTTP-запрос AJAX.

Ответ 4

У меня была одна и та же проблема, и я исправил ее, убедившись, что после моего URL-адреса произошел косой черт. Поэтому вместо:

$.get('/example/url')

использование:

$.get('example/url/')

Похоже, прошло некоторое время с тех пор, как вы опубликовали это, но, возможно, это поможет!

Ответ 5

Причина, по которой я получил это, состояла в том, что я принимал элемент с обработчиком событий AJAX, клонировал его, а затем добавлял новый элемент в свой документ. По какой-то причине это означало, что событие, связанное с новым элементом, не будет рассматривать его как обычный запрос ajax (Accept: text/html вместо application/json, no X-Requested-With и т.д.).

Чтобы исправить это, все, что я сделал, это изменить событие на новый jQuery эквивалент live() (неуверенный, что они называют это сейчас). Итак, из:

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

To:

$(document).on('click', '.basket-add', function() { /* etc */ });

Ответ 6

Это не может быть ответ, но я несколько раз зацепил свои глазные яблоки, прежде чем выяснять, что моя ошибка была довольно косой. (Что меня убило, так это то, что он работал над моей сборкой, но не в производстве, и я до сих пор не понимаю, почему это так, но...)

Убедитесь, что обработчик событий действительно подключен! Если нет заголовка X-Requested-With, это может быть по уважительной причине! У меня была форма, чей атрибут действия был правильным 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 */);
});

Дополнительная литература: https://learn.jquery.com/events/event-delegation/