Jquery(またはプレーンJS)によって行われたajaxリクエストから「X-Requested-With」ヘッダーを削除しようとした経験があるかどうかを知りたいと思いました。出来ますか?
2番目の部分:Grease Monkeyのajaxリクエストがこのヘッダーを設定するかどうか知っていますか?
ありがとう
ヘッダーは次のようになります。
X-Requested-With XMLHttpRequest
「第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...
@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...
});
何故なの?試してください:
(function(){
$.ajaxSettings.beforeSend=function(xhr){
xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
};
})(jQuery);
幸運を!
JQueryでこれを行うには、リクエストをクロスドメインとして設定します。例:
server.php
<?='<pre>'.print_r($_SERVER,1);?>
client.js
$.ajax({ url: 'server.php', crossDomain: true }).success(function(r){document.write(r)})
jQueryは現時点ではこれを行うためのメソッドを公開していません しばらく前にチケットがありました Firefoxエラーに関連していますが、オプションにするのではなく、Firefoxのエラーの問題を修正しました。
興味がある場合は、ここで追加された場所を確認できますが、jQueryコアを編集/オーバーライドせずに削除することはできません: http://github.com/jquery/jquery/blob/master/src/ ajax.js#L37