22

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

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

私には3つのオプションがあるようです:

  1. $.ajax() の beforeSend 関数でその XID ヘッダーを削除する方法を見つけてください。これは ajaxPrefilter() 関数の後に呼び出されることが確認されています。
  2. $.ajax() を完全に使用するのをやめて、自分で Ajax のものを書くだけです。
  3. カスタム XID ヘッダーを受け入れるシステムのバックエンドを $.ajax() にポイントさせ、cURL を介してサード パーティ サイトへの要求を実行します。

簡単な方法がある場合は、オプション #1 が推奨されます。これは、最もクリーンで最速のルートになるためです。方法がわかりません。

このようにオーバーライドしようとしましたが、うまくいきませんでした:

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

何か案は?

4

5 に答える 5

2

beforeSend()既に渡されたデータXMLHttpRequestはヘッダーのみを変更できるため、ヘッダーを使用して削除することはできません。

しかし、今日、2019 年には、不要な (非標準の) ヘッダーをjQuery.ajaxPrefilter().

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  delete options.headers['custom-xid-header'];
});

$.ajax({
  url: '//httpbin.org/get',
  headers: {
    'custom-xid-header': 'remove me',
    "Accept": "what/ever"
  },
  datatype: 'json',
  success: function(data) {
    console.log(data.headers);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!--script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script-->

于 2019-01-02T02:06:10.473 に答える
0

オーバーライドは機能していないようですが、簡単な修正方法があります。

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

sendToken変数を確認してください。それはグローバルです。アプリの開始時に、ヘッダーをほぼどこにでも設定する必要があるため、常に true に設定します。

しかし、「Authorization」ヘッダーを送信したくない場合は、リクエストが送信される前に、グローバルsendTokenfalseに渡すだけです。すべてのリクエストが完了したら、もう一度trueに設定するだけです...

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

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

于 2016-12-03T18:17:35.860 に答える
0

これにより、$.ajaxSetup() で設定されたヘッダーが削除されます。beforeSend() でも動作すると思います。

delete $.ajaxSettings.headers["custom-xid-header"]
于 2017-02-15T15:00:07.610 に答える