アクセス制御要求ヘッダーは、jQueryを使用してAJAX要求のヘッダーに追加されます


404

jQueryからのAJAX POSTリクエストにカスタムヘッダーを追加したいと思います。

私はこれを試しました:

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
    //OR
    //beforeSend: function(xhr) { 
    //  xhr.setRequestHeader("My-First-Header", "first value"); 
    //  xhr.setRequestHeader("My-Second-Header", "second value"); 
    //}
}).done(function(data) { 
    alert(data);
});

このリクエストを送信してFireBugで監視すると、次のヘッダーが表示されます。

オプションxxxx / yyyy HTTP / 1.1
ホスト:127.0.0.1:6666
ユーザーエージェント:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:11.0)Gecko / 20100101 Firefox / 11.0
Accept:text / html、application / xhtml + xml、 application / xml; q = 0.9、/ ; q = 0.8
Accept-Language:fr、fr-fr; q = 0.8、en-us; q = 0.5、en; q = 0.3
Accept-Encoding:gzip、deflate
Connection:keep -alive
Origin:null
Access-Control-Request-Method:POST
Access-Control-Request-Headers:my-first-header、my-second-header
プラグマ:no-cache
Cache-Control:no-cache

カスタムヘッダーが次の場所に移動するのはなぜですかAccess-Control-Request-Headers

Access-Control-Request-Headers:my-first-header、my-second-header

私はこのようなヘッダー値を期待していました:

My-First-Header:最初の値
My-Second-Header:2番目の値

出来ますか?



質問のタイトルには、「他のドメインの場合」
会計士

回答:


138

Firefoxで見たのは実際のリクエストではありません。HTTPメソッドはPOSTではなくOPTIONSであることに注意してください。実際には、クロスドメインAJAXリクエストを許可する必要があるかどうかを判断するためにブラウザが行う「プリフライト」リクエストでした。

http://www.w3.org/TR/cors/

プリフライトリクエストのAccess-Control-Request-Headersヘッダーには、実際のリクエストのヘッダーのリストが含まれています。サーバーは、ブラウザが実際のリクエストを送信する前に、これらのヘッダーがこのコンテキストでサポートされているかどうかを報告することが期待されます。


438

以下は、jQuery Ajax呼び出しでリクエストヘッダーを設定する方法の例です。

$.ajax({
  type: "POST",
  beforeSend: function(request) {
    request.setRequestHeader("Authority", authorizationToken);
  },
  url: "entities",
  data: "json=" + escape(JSON.stringify(createRequestObject)),
  processData: false,
  success: function(msg) {
    $("#results").append("The result =" + StringifyPretty(msg));
  }
});

10
thx、私はカスタムヘッダーでAjaxリクエストを送信することを知っています。私の問題は別のドメインにあります。すべてのカスタムヘッダーはAccess-Control-Request-Headersに配置されます。それはブラウザの単なるセキュリティです:クロスドメイン。
2012年

そうです、ブラウザーのクロスドメイン要求では、いくつかの問題が発生する可能性があります。いつでもプロキシスクリプトを使用してクロスドメインリクエストを送信できます
milkovsky

API KEYでヘッダーを追加するにはどうすればよいですか?
Si8、2017年

@ SI8この投稿を確認してくださいstackoverflow.com/questions/5517281/...
milkovsky

178

以下のこのコードは私にとってはうまくいきます。私は常に一重引用符のみを使用し、それは正常に動作します。一重引用符または二重引用符のみを使用し、混同しないでください。

$.ajax({
    url: 'YourRestEndPoint',
    headers: {
        'Authorization':'Basic xxxxxxxxxxxxx',
        'X-CSRF-TOKEN':'xxxxxxxxxxxxxxxxxxxx',
        'Content-Type':'application/json'
    },
    method: 'POST',
    dataType: 'json',
    data: YourData,
    success: function(data){
      console.log('succes: '+data);
    }
  });

1
thx、私はカスタムヘッダーでAjaxリクエストを送信することを知っています。私の問題は別のドメインにあります。すべてのカスタムヘッダーはAccess-Control-Request-Headersに配置されます。それはブラウザの単なるセキュリティです:クロスドメイン。
2014年

おかげで、「Authorization:Basic XXXXXX」というヘッダーを誤って設定してしまい、プロジェクトでiOS 9 / Safari 9がSyntaxError DOM 12をスローしていました。
マーク

4
二重引用符または単一引用符を意味しますか?だれもが二重括弧を使うとは思いません。
DBS

3
二重引用符または単一引用符(「括弧」ではない)は、ここでは何もしません。
ペレ2017年

Laravel 5.6以降用のX-CSRF-TOKEN
Abdul Rahman A Samad

12

カスタムヘッダーを送信するため、CORSリクエストは単純なリクエストではないため、ブラウザは最初にプリフライトOPTIONSリクエストを送信して、サーバーがリクエストを許可していることを確認します。

ここに画像の説明を入力してください

サーバーでCORSをオンにすると、コードは機能します。代わりにJavaScriptフェッチを使用することもできます(ここ

nginx(nginx.confファイル)でCORSをオンにする設定例は次のとおりです。

Apache(.htaccessファイル)でCORSを有効にする設定例を以下に示します。


3

そして、そのため、JavaScriptを使用してボットを作成することはできません。これは、オプションがブラウザーで許可されているものに制限されているためです。ほとんどのブラウザーが従うCORSポリシーに準拠するブラウザーを注文して、 ランダムな要求を他のオリジンに送信し、その応答を簡単に取得することはできません。

さらに、origin-headerブラウザーに付属の開発者ツールなどから、一部のリクエストヘッダーを手動で編集しようとした場合、ブラウザーは編集を拒否し、プリフライトOPTIONSリクエストを送信することがあります。


-10

rack-cors gem を使用してみてください。そして、Ajax呼び出しにヘッダーフィールドを追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.