私はシステム内で動作する JS スクリプトを作成していますが、このスクリプトでは、jQuery.ajaxPrefilter() に登録された関数内の jqXHR.setRequestHeader() を介して、すべての Ajax リクエストにカスタム XID ヘッダーが追加されています。
私のスクリプトでは、このカスタム XID ヘッダーを許可するように Access-Control-Allow-Headers が設定されていないサードパーティのサイトに Ajax リクエストを送信する必要があります。
3つの選択肢があるようです:
- $.ajax() の beforeSend 関数で XID ヘッダーを削除する方法を見つけます。この関数は、ajaxPrefilter() 関数の後に呼び出されることを確認しました。
- $.ajax() の使用を完全にやめ、Ajax 関連の部分を自分で記述します。
- $.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()