2013-08-28 69 views
14

我正在寫一個JS腳本,它生活在一個系統中,該系統現在通過jQuery.ajaxPrefilter()中註冊的函數中的jqXHR.setRequestHeader()向所有Ajax請求添加自定義XID標頭。有什麼辦法可以刪除由setRequestHeader()設置的Ajax頭?

在我的腳本中,我需要向第三方站點發出Ajax請求,該站點的Access-Control-Allow-Headers未設置爲允許此自定義XID標頭。

看來我有3種選擇:

  1. 找到一個方法來刪除$就在於XID頭()的beforeSend功能,我已經證實了ajaxPrefilter()函數之後被調用。
  2. 完全放棄使用$ .ajax(),而只是自己編寫Ajax。
  3. $ .ajax()指向系統的後端,它接受定製的XID頭,並通過cURL向第三方站點執行請求。

選擇#1是首選,如果有一個簡單的方法來做到這一點,因爲它將是最乾淨和最快的路線。只是想不通如何

我試圖重寫它這樣,但它沒有工作:

beforeSend: function(jqXHR, settings) { 
    jqXHR.setRequestHeader('custom-xid-header', null); 
} 

任何想法?

+0

很確定這是不可能的(不幸的是)。我覺得這很容易克服,但需要通過jQuery進行更改。 'jqXHR'是一個真正的'XMLHttpRequest'的包裝對象。所有jQuery需要做的就是跟蹤任何額外的/自定義的頭文件(比如在一個Object中),並且使用像removeHeader和setHeader這樣的方法來修改這個Object。然後,當真正的請求被創建併發送時,該對象將被用於*實際*添加請求頭部到真實請求。我想根據真實的工作流程/生命週期內部,它可能會也可能不會是可能的 – Ian

+0

大鼠,這就是我所害怕的。 –

+0

是的,它看起來像設置值爲'空'或'「」只是設置一個空值...不刪除整個標題。將功能請求提交給jQuery可能不是一個好主意。並以此爲例。再次,它可能會也可能不會取決於內部生命週期 – Ian

回答

2
$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
     jqXHR.setRequestHeader('custom-xid-header', null); 
    } 
}) 

看到http://api.jquery.com/jQuery.ajaxSetup/

+2

是不是OP是否嘗試過並且沒有工作? – Bergi

+2

正確的答案是http://stackoverflow.com/questions/2464192/how-to-remove-http-specific-headers-in-javascript –

+0

@AramKocharyan不,因爲它不_remove_頭 – randomsock

0

Overiding似乎的不工作,但有一個簡單的解決。

$.ajaxSetup({ 
     beforeSend: function (jqXHR) { 
      if (sendToken == true) 
       jqXHR.setRequestHeader("Authorization", cookie); 
      return true; 
     } 
    }); 

檢查sendToken變量。這是全球性的。 在我的應用程序開始時,我總是將它設置爲true,因爲我需要在任何地方設置標頭。

但是,當我不想送「授權」頭,我傳遞全球sendToken任何請求都可以去了。當所有的請求完成後,我只是簡單地將它設置爲true再次...

訣竅是jqXHR變量是本地的,不會每次都保留指定的值。 並且在ajaxSetup中設置的當前值不起作用,因爲它總是添加新值而不是替換它。最重要的條件是我認爲最簡單有效的方法。

它爲我工作。

0

這將刪除使用$ .ajaxSetup()設置的標頭。我想它會和beforeSend()一起工作。

delete $.ajaxSettings.headers["custom-xid-header"] 
3

我意識到這是一箇舊的線程,但它仍然是一個問題!希望以下內容有助於爲其他人解決問題,因爲它對我們有幫助。

設置一個頭null/undefined/""它被設置後也刪除它,它發出的頭還在,但與不用值或「不確定」或「空」。這可能從來不是你想要的,在我們的例子中,當它是授權標頭時,完全擰緊SSO。

我們想出瞭解決方案依賴於@ marlar的建議(感謝)和jQuery的另一個不足的混合:你只能有一個beforeSend()掛鉤,任何新的鉤取代前一個。看起來,如果您在特定的$.ajax()請求中提供beforeSend(),它也會發生這種情況 - 它將覆蓋$.ajaxSetup()中的任何默認值。通過這樣做,可以防止默認掛鉤設置標題。 (這不是100%理想的,因爲在默認的beforeSend()中可能會做其他事情,但這種情況不會發生,但嘿)。

所以這科佩斯既爲特定請求靜態和動態組頭:

if($.ajaxSettings && $.ajaxSettings.headers) { 
    delete $.ajaxSettings.headers.Authorization; 
} 
$.ajax({ 
    beforeSend: function() {}, // no op 
    // ... 
}); 

不能爲prefilter()做同樣的,但我認爲beforeSend()是這樣無論如何的更爲常見方式。

相關問題