web-dev-qa-db-ja.com

X-Requested-Withヘッダーをajaxリクエストから削除できますか?

Jquery(またはプレーンJS)によって行われたajaxリクエストから「X-Requested-With」ヘッダーを削除しようとした経験があるかどうかを知りたいと思いました。出来ますか?

2番目の部分:Grease Monkeyのajaxリクエストがこのヘッダーを設定するかどうか知っていますか?

ありがとう

ヘッダーは次のようになります。

X-Requested-With XMLHttpRequest
24
mkoryak

「第2部:グリースモンキーのajaxリクエストがこのヘッダーを設定するかどうか知っていますか?」

いいえ、 Greasemonkeyの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
Brock Adams

@vampによって提案されたjQueryのヘッダーを削除するための解決策は正しい方向に進んでいますが、他の人が述べているように、空のX-Requested-Withヘッダーが送信されます。

BeforeSendコールバックは、実際のXMLHttpRequestオブジェクト(xhr)ではなく、jQueryのXHRオブジェクト(jqXHR)を受け取ります。これは、beforeSendが呼び出されるまでインスタンス化されません。

JqXHRのsetRequestHeaderメソッドは、オブジェクトにヘッダーを追加します。このメソッドは、ヘッダーオブジェクトにX-Requested-Withエントリを追加した直後に、同じ名前のxhrメソッドを使用して後で繰り返されます。

これが起こっている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設定がfalseと評価されない限り)、それが望ましい解決策ではない可能性があります。次に、すぐにxhrヘッダーを設定しますが、設定を解除することはできません。


jQuery.ajaxでX-Requested-Withヘッダーを送信しないようにするため:

jQuery.ajaxは、XMLHttpRequestオブジェクトを作成するためのjQueryの組み込みファクトリメソッドをオーバーライドする設定xhrを提供します。このファクトリメソッドをラップしてから、ブラウザのネイティブsetRequestHeaderメソッドをラップすることにより、x-Requested-Withヘッダーを設定するためのjQueryからの呼び出しを無視できます。

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

何故なの?試してください:

(function(){
    $.ajaxSettings.beforeSend=function(xhr){
        xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
    };
})(jQuery);

幸運を!

7
vamp

JQueryでこれを行うには、リクエストをクロスドメインとして設定します。例:

server.php

<?='<pre>'.print_r($_SERVER,1);?>

client.js

$.ajax({ url: 'server.php', crossDomain: true }).success(function(r){document.write(r)})
6
f.ardelian

jQueryは現時点ではこれを行うためのメソッドを公開していません しばらく前にチケットがありました Firefoxエラーに関連していますが、オプションにするのではなく、Firefoxのエラーの問題を修正しました。

興味がある場合は、ここで追加された場所を確認できますが、jQueryコアを編集/オーバーライドせずに削除することはできません: http://github.com/jquery/jquery/blob/master/src/ ajax.js#L37

0
Nick Craver