setRequestHeader() によって設定された Ajax ヘッダーを削除する方法はありますか? 質問する

setRequestHeader() によって設定された Ajax ヘッダーを削除する方法はありますか? 質問する

私はシステム内で動作する JS スクリプトを作成していますが、このスクリプトでは、jQuery.ajaxPrefilter() に登録された関数内の jqXHR.setRequestHeader() を介して、すべての Ajax リクエストにカスタム XID ヘッダーが追加されています。

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

3つの選択肢があるようです:

  1. $.ajax() の beforeSend 関数で XID ヘッダーを削除する方法を見つけます。この関数は、ajaxPrefilter() 関数の後に呼び出されることを確認しました。
  2. $.ajax() の使用を完全にやめ、Ajax 関連の部分を自分で記述します。
  3. $.ajax() がカスタム XID ヘッダーを受け入れるシステムのバックエンドを指すようにし、cURL 経由でサードパーティのサイトへのリクエストを実行します。

オプション1は、簡単な方法があれば、最もクリーンで最速のルートとなるため、推奨されます。どうやって

次のように上書きしてみましたが、うまくいきませんでした:

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

何か案は?

ベストアンサー1

これは古いスレッドだとは思いますが、まだ問題があります。次の内容が、私たちの場合と同様に、他の誰かの問題解決に役立つことを願っています。

ヘッダーを設定した後にnull/ undefined/に設定すると、""ないこれを削除すると、ヘッダーは送信されますが、値はないか、「未定義」または「null」になります。これはおそらく望ましくないことであり、私たちのケースでは、Authorization ヘッダーの場合、SSO が完全に台無しになります。

私たちが思いついた解決策は、@marlarの提案(ありがとう)とjQueryの別の欠陥を組み合わせたものです。beforeSend()フックは1つしか持てず、新しいフックは置き換える前のものと同じです。beforeSend()特定の$.ajax()リクエストで を指定した場合も、これは当てはまるようです。 のデフォルトの が上書きされます$.ajaxSetup()。そうすることで、デフォルトのフックがヘッダーを設定するのを防ぐことができます。(デフォルトで他の処理が行われ、それが実行されなくなる可能性があるため、100% 理想的ではありませんbeforeSend()が、まあ)。

したがって、これは特定のリクエストの静的ヘッダーと動的に設定されたヘッダーの両方に対応します。

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

については同じことはできませんが、とにかく の方がはるかに一般的な方法だprefilter()と思います。beforeSend()

おすすめ記事