我想知道是否有人嘗試從jquery(或普通的JS)發出的ajax請求中刪除'X-Requested-With'頭部。可能嗎?我可以從ajax請求中刪除X-Requested-With標頭嗎?
第二部分:你知道Grease Monkey的ajax請求是否設置了這個頭文件嗎?
感謝
頭看起來是這樣的:
X-Requested-With XMLHttpRequest
我想知道是否有人嘗試從jquery(或普通的JS)發出的ajax請求中刪除'X-Requested-With'頭部。可能嗎?我可以從ajax請求中刪除X-Requested-With標頭嗎?
第二部分:你知道Grease Monkey的ajax請求是否設置了這個頭文件嗎?
感謝
頭看起來是這樣的:
X-Requested-With XMLHttpRequest
「第二部分:你知道,如果油猴的Ajax請求設置了這個頭文件?「
不,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...
jQuery的不公開的方法來做到這一點的那一刻,there was a ticket on it a while back有關Firefox的錯誤,但不是使它成爲一個選擇,他們修復了Firefox中的錯誤問題。
如果你好奇,你可以看到它在這裏補充,但沒有編輯/你不能刪除重寫的jQuery核心:http://github.com/jquery/jquery/blob/master/src/ajax.js#L370
爲什麼不呢? 嘗試:
(function(){
$.ajaxSettings.beforeSend=function(xhr){
xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
};
})(jQuery);
好運!
不是我真的希望它是瀏覽器特定的,但它對我來說工作正常Firefox 4,Chrome 10,IE 9和Opera 11.對於我所需要的,我不介意改變*所有* AJAX請求,但我想知道是否有辦法讓這種情況只發生在特定的請求上。 – patridge 2011-05-13 14:02:12
你不能添加beforeSend回調到$ .ajax調用本身嗎? – hayavuk 2011-06-06 20:02:57
根據@馬林的[大致相同]的答案,它看起來像你可以。在一個[示例jsFiddle](http://jsfiddle.net/patridge/amA3W/)中,我刪除了'X-Requested-With'頭並且未能刪除'Referer'頭(Chrome不會讓它發生) 。爲了獲得更多樂趣,我還將[這個全要求版本的小提琴]放在一起(http://jsfiddle.net/patridge/h4Lvp/)。 – patridge 2012-03-06 16:01:13
您可以考慮這樣的:
$.ajax({
url: 'http://fiddle.jshell.net/favicon.png',
beforeSend: function(xhr) {
xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
},
success: function(data) {
if (console && console.log){
console.log('Got data without the X-Requested-With header');
}
}
});
要使用jQuery做到這一點,設置您的請求跨域。例如:
server.php
<?='<pre>'.print_r($_SERVER,1);?>
client.js
$.ajax({ url: 'server.php', crossDomain: true }).success(function(r){document.write(r)})
添加'crossDomain:true'爲我工作,謝謝! – 2014-04-19 14:23:34
這對我試圖訪問Pinterest API使用jQuery(例如https://api.pinterest.com/v3/pidgets/users/USERNAME/pins/) – Tebbers 2016-03-11 13:30:33
通過@vamp提出用於去除在jQuery的標頭中的溶液是在正確的軌道上,但作爲其他人表示它仍然會導致發送一個空的X-Requested-With報頭。
的beforeSend回調接收jQuery的 XHR對象(jqXHR),而不是實際的XMLHttpRequest對象(XHR),它甚至沒有實例化,直到beforeSend被調用後。
jqXHR中的setRequestHeader方法將標題添加到一個對象,稍後使用相同名稱的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-要求,隨着頭,然後jQuery將(除非跨域設置評估板錯誤,但這可能不是所需的解決方案)。然後立即設置xhr標題,它不能被取消設置。
爲了防止發送的X請求-隨着頭與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...
});
我有一個腳本,使跨域請求,應該已經是一個簡單的CORS請求,但由於jQuery自動添加了「X-Requested-With」標頭,這被認爲是自定義的,它使瀏覽器進行了不必要的CORS預檢檢查。 感謝分享這個,我瘋了,試圖找出爲什麼我不能跳過預檢。 – Dooms101 2015-11-30 20:18:16
我認爲擁有這個頭文件集的好處之一是,您可以在服務器端腳本中檢查它,並確定它是否確實是AJAX請求,因此如何處理它? – MrWhite 2010-07-30 15:34:03
w3d:服務器端知道你發出ajax請求的缺點是他們可以阻止你在你的GM腳本中執行它 – mkoryak 2011-02-05 21:52:16