2

基本認証が必要なサーバーから応答を取得しようとしています。したがって、curlを次のように使用すると次のようになります。

curl -u user:pass http://myserver.com/get/send-my-data

それは私に正しい反応を与えています。しかし、jqueryAJAXを使用してXHRリクエストを作成しているとき。403エラーが発生しています。これが私のAJAXセットアップです:

            $.ajax ({
            type: 'GET',
            url: 'http://myserver.com/get/send-my-data',
            beforeSend: function(xhr) {
                xhr.setRequestHeader("Authorization", "Basic" + encode64(user:pass)); // I have calculated base64 encoded value of user:pass correctly.
            },
            success: function(d) { console.log(d); },
            crossDomain: 'true'
        });

403の応答があります。これは、-vオプションを使用してcurlから取得したリクエストヘッダーです。

> POST /get/send-my-data HTTP/1.1
**> Authorization: Basic ********** // Removed original code deliberately**
> User-Agent: curl/7.27.0
> Host: localhost:8080
> Accept: */*
> Content-Length: 264
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------3c0e06f1e2b4

これが私のXHRリクエストのcharlesから取得したヘッダーです

OPTIONS /get/send-my-data HTTP/1.1
Host    10.40.55.110:4502
Access-Control-Request-Method   GET
Origin  http://localhost:8080
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML,     like Gecko) Chrome/22.0.1229.79 Safari/537.4
**Access-Control-Request-Headers    origin, authorization, accept**
Accept  */*
Referer http://localhost:8080/proof/check.html
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.3

なぜこれが起こっているのか理解できませんでしたか?XHRリクエストヘッダーにcurlヘッダーに表示されているようなAuthorizationヘッダーが表示されないのはなぜですか。私が間違っているところを提案してください。

PS:それはクロスドメインリクエストです。

4

1 に答える 1

3

クロスドメインリクエストを送信していて、リクエストが POST メソッドを使用していたため、この問題に直面していました。したがって、クロスドメイン サーバーで POST を実行する場合、プリフライトの概念が浮かび上がります。

Preflight では、オプション ヘッダーを送信するだけで、どのリクエストがヒットするかをリソースに伝えます。次に、サーバーは、リクエストを安全に送信できるかどうかを判断します。

そして、サーバーが OK を送信すると、実際のリクエストが送信されます。これらの行がより説明になるかもしれません。

プリフライト リクエストは、実際のリクエストが安全に送信できるかどうかを判断するために、最初に OPTIONS メソッドによって他のドメインのリソースに HTTP リクエストを送信します。クロスサイト リクエストは、ユーザー データに影響を与える可能性があるため、このようにプリフライトされます。特に、次の場合、リクエストはプリフライトされます。

GET、HEAD、または POST 以外のメソッドを使用します。また、POST を使用して、application/x-www-form-urlencoded、multipart/form-data、または text/plain 以外の Content-Type を持つリクエスト データを送信する場合 (たとえば、POST リクエストが XML ペイロードをサーバーに送信する場合) application/xml または text/xml を使用すると、リクエストがプリフライトされます。

リクエストにカスタム ヘッダーを設定します (たとえば、リクエストは X-PINGOTHER などのヘッダーを使用します)。

出典: MDN CORS ドキュメント

于 2013-11-01T08:16:26.530 に答える