2013-08-28 10 views
14

私は、jQuery.ajaxPrefilter()で登録された関数でjqXHR.setRequestHeader()を介してすべてのAjaxリクエストにカスタムXIDヘッダーを追加するシステム内にあるJSスクリプトを作成しています。setRequestHeader()によって設定されたAjaxヘッダーを削除する方法はありますか?

私のスクリプトでは、このカスタムXIDヘッダーを許可するようにAccess-Control-Allow-Headersが設定されていないサードパーティのサイトにAjaxリクエストを行う必要があります。

私が3つのオプションがありそうです:

  1. は、私が確認しているの$アヤックスでXIDヘッダー()のbeforeSend機能は、ajaxPrefilter()関数の後に呼び出されることを削除する方法を見つけます。
  2. Forgoは$ .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'のようなメソッドを使ってそのオブジェクトを変更する必要があります。次に、実際の要求が作成されて送信されるとき、そのオブジェクトは実際の要求にリクエストヘッダを実際に追加するために使用されます。私は実際のワークフロー/ライフサイクルに応じて内部的には可能かもしれないし、そうでないかもしれない。 – Ian

+0

ラット、それは私が恐れていたものだ。 –

+0

ええ、値を 'null'に設定するか、' '' 'だけで空の値を設定するように見えます...ヘッダ全体を削除しません。 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いいえ、ヘッダーを削除しないためです – randomsock

0

Overidingが動作するのを思えませんが、簡単な修正があります。

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

sendToken変数を確認してください。それはグローバルです。 私のアプリの初めに、私はいつも本当のところに設定しました。

しかし、私は「認可」ヘッダを送信したくない場合に任意の要求が行くことができる前に、私はちょうどにグローバルsendTokenを渡します。すべてのリクエストが完了したら、単にに設定します。 ...

トリックは、jqXHR変数がローカルであり、毎回割り当て値を保持しないことです。 ajaxSetupに設定されている現在の値を上書きすることは、新しい値を置き換えるのではなく常に追加するため、機能しません。それの上に条件があることは、私は最も単純で効率的な方法だと思う。

それは私のために働いた。

0

$ .ajaxSetup()で設定されたヘッダーが削除されます。私はそれがbeforeSend()でもうまくいくと思います。

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

これは古いスレッドだとわかりましたが、それでも問題は残っています。次のことが、私たちにとってそうであるように、誰かのためにそれを解決するのに役立つことを願っています。それはないないを設定されています後null/undefined/""にヘッダを設定

は、それはまだヘッダを送信しますが、値なしまたは「未定義」または「ヌル」のいずれかで、それを削除。おそらくこれは決してあなたが望むものではないでしょう。私たちの場合、AuthorizationヘッダーのときにSSOを完全にねじ込みます。一つだけbeforeSend()フックを持つことができ、かつ前のものに置き換えられ任意の新しいフック:私たちが思いついた

ソリューションは、@ marlarの提案(感謝)とjQueryの別の欠乏の組み合わせに依存しています。特定の$.ajax()リクエストにbeforeSend()を指定すると、これは真実であると思われます。$.ajaxSetup()のデフォルトの設定よりも優先されます。これにより、デフォルトのフックがヘッダーを設定できなくなります。 (デフォルトでbeforeSend()で行われる他のことが起こる可能性があるので、それは100%理想的ではありませんが、ちょっと)。

だから、これは、静的および動的に特定の要求のヘッダーを設定し、両方に対処:あなたはprefilter()ために同じことを行うことはできません

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

が、私はbeforeSend()はとにかくこれを行うためのはるかに一般的な方法だと思います。

関連する問題