я могу удалить заголовок X-Requested-With из запросов ajax?

TLDR: Это предупреждение не указывает на ошибку в вашем коде, но вы можете избежать этого, используя poper c ++ reinterpret_cast (благодаря @Kurt Stutsman).


Объяснение:

Причина предупреждения:

  • sockaddr состоит из unsigned short (обычно 16 бит) и массива char, поэтому его требование к выравниванию равно 2.
  • sockaddr_in содержит (среди прочего) a struct in_addr, который имеет требование выравнивания 4, которое, в свою очередь, означает sockaddr_in, также должно быть выровнено с границей 4 байта.

По этой причине приведение произвольного sockaddr* в sockaddr_in* изменяет требование выравнивания, и доступ к объекту с помощью нового указателя будет даже нарушать правила псевдонимов и приводить к неопределенному поведению.

Почему вы можете игнорировать его:

В вашем случае объект p->ai_addr указывает на, скорее всего, это sockaddr_in или sockaddr_in6 объект в любом случае (как определено проверив ai_family), и поэтому операция безопасна. Однако компилятор не знает этого и выдает предупреждение.

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

Решение. Я не знаю, как это сделать (кроме предупреждения), что необычно для предупреждений, разрешенных -Weverything. Вы могли бы скопировать объект, на который указывает p->ai_addr byte by byte, на объект соответствующего типа, но тогда вы, скорее всего, больше не будете использовать addr так же, как раньше, поскольку теперь он указывает на другой (например, локальной) переменной. -Weverything - это не то, что я бы использовал для своих обычных сборок, потому что он добавляет слишком много шума, но если вы хотите его сохранить, @Kurt Stutsman упомянул хорошее решение в комментариях:

clang ++ (g ++ не выдает предупреждения в любом случае) не выдает предупреждения, если вы используете вместо [c] f17 вместо c style cast (который вы не должны использовать в любом случае), хотя оба имеют (в данном случае ) точно такая же функциональность. Возможно, потому что reinterpret_cast явно сообщает компилятору: «Поверьте мне, я знаю, что я делаю» .


На стороне. Примечание: в коде c ++ вы не нужны ключевые слова struct.

24
задан npdoty 1 August 2010 в 03:04
поделиться

3 ответа

"2-я часть: вы знаете, устанавливают ли ajax-запросы Grease Monkey этот заголовок?"

Нет, Greasemonkey's GM_xmlhttpRequest() не устанавливает этот заголовок (хотя вы, конечно, можете его добавить).

Запрос по умолчанию, выдаваемый GM_xmlhttpRequest(), выглядит так же, как обычный запрос браузера.
Например:

GM_xmlhttpRequest
({
    method:     "GET",
    url:        "http://google.com/",
    onload:     function(response) {alert(response.responseText); }
});

Для моего пакетного сниффера выглядит так:

GET / HTTP/1.1
    Request Method: GET
    Request URI: /
    Request Version: HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Keep-Alive: 115
Connection: keep-alive
Cookie: blah, blah, blah, blah, blah...
3
ответ дан 28 November 2019 в 23:51
поделиться

Решение для удаления заголовка в jQuery, предложенное @vamp, находится на правильном пути, но, как утверждали другие, это все равно приведет к отправке пустого заголовка X-Requested-With.

Обратный вызов beforeSend получает объект XHR jQuery (jqXHR), а не фактический объект XMLHttpRequest (xhr), который даже не создается до тех пор, пока не будет вызван beforeSend.

Метод setRequestHeader в jqXHR добавляет заголовки к объекту, который затем повторяется позже, используя метод xhr с тем же именем, сразу после добавления записи X-Requested-With к объекту заголовков.

Вот часть в jQuery, где это происходит:

if ( !options.crossDomain && !headers["X-Requested-With"] ) {
    headers["X-Requested-With"] = "XMLHttpRequest";
}

for ( i in headers ) {
    xhr.setRequestHeader( i, headers[ i ] );
}

Что приводит к проблеме: если вы не укажете заголовок X-Requested-With, то jQuery будет (если не указан параметр crossDomain оценивает ложь, но это может быть не желаемое решение). Затем он сразу устанавливает заголовки xhr, которые не могут быть сброшены.


Чтобы предотвратить отправку заголовка X-Requested-With с помощью jQuery.ajax:

jQuery.ajax предоставляет параметр xhr, который переопределяет встроенный метод фабрики jQuery для создания объекта XMLHttpRequest. Оборачивая этот фабричный метод, а затем оборачивая собственный метод setRequestHeader браузера, можно игнорировать вызов jQuery для установки заголовка X-Requested-With.

jQuery.ajax({

    url: yourAjaxUrl,

    // 'xhr' option overrides jQuery's default
    // factory for the XMLHttpRequest object.
    // Use either in global settings or individual call as shown here.
    xhr: function() {
        // Get new xhr object using default factory
        var xhr = jQuery.ajaxSettings.xhr();
        // Copy the browser's native setRequestHeader method
        var setRequestHeader = xhr.setRequestHeader;
        // Replace with a wrapper
        xhr.setRequestHeader = function(name, value) {
            // Ignore the X-Requested-With header
            if (name == 'X-Requested-With') return;
            // Otherwise call the native setRequestHeader method
            // Note: setRequestHeader requires its 'this' to be the xhr object,
            // which is what 'this' is here when executed.
            setRequestHeader.call(this, name, value);
        }
        // pass it on to jQuery
        return xhr;
    },

    success: function(data, textStatus, jqXHR) {
        // response from request without X-Requested-With header!
    }

    // etc...

});
22
ответ дан Synexis 28 November 2019 в 23:51
поделиться

jQuery на данный момент не предлагает метода для этого, некоторое время назад был тикет по этому поводу, связанный с ошибками Firefox, но вместо того, чтобы сделать это опцией, они исправили проблему ошибки в Firefox.

Если вам интересно, вы можете посмотреть, где он добавлен здесь, но вы не можете удалить его без редактирования/переопределения ядра jQuery: http://github.com/jquery/jquery/blob/master/src/ajax.js#L370

0
ответ дан 28 November 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: