私は2つのドメインを持っています。あるドメインから別のページを介して JSON オブジェクトにアクセスしようとしています。この問題に関して見つけたすべてを読みましたが、まだこれを理解できません。
JSON を提供するドメインには、次の設定があります。
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
Header set Access-Control-Allow-Headers "origin, authorization, accept"
他のドメインから、次のように呼び出しています。
$.ajax({
type:'get',
beforeSend: function(xhr) {
var auth = // authentication;
xhr.setRequestHeader("Authorization", "Basic " + auth);
}
url:myUrl,
dataType:'json',
error: function(xhr, textStatus, errorThrown) { console.log(textStatus, errorThrown); }
})
「auth」が適切に初期化されていることを知っています(ログに記録され、チェックされています)。ただし、これは機能しません。Firefox のコンソールで、リクエスト URL を取得します: ...
Request Method:
OPTIONS
Status Code:
HTTP/1.1 401 Authorization Required
beforeSend:...
その部分を取り除くと、次のようになります
Request Method:
GET
Status Code:
HTTP/1.1 401 Authorization Required
ただし、JSON を提供するドメインは、JSONP も提供できます。主にアプリケーションが専用ブラウザで常に実行されるため、これを使用したくありません。この問題が心配です。さらに重要なことは、自分が行っていることの実際の何が問題なのかを知りたいということです。実際には、JSONP メモリ リークを克服するさまざまな方法 (jQuery を使用しないなど) があることを知っています。
とにかく、JSONP を使用したとき、私のコードは次のようになりました。
$.ajax({
url:newUrl,
dataType:'jsonp',
jsonp:'jsonp'
}).done(function(d){console.log(d)})
これにより、次のようになります
Request Method:
GET
Status Code:
HTTP/1.1 200 OK
ユーザー名とパスワードの警告ボックスが表示された後。
JSON リクエストとは対照的に、jQuery が JSONP リクエストを処理する方法に根本的な違いはありますか? もしそうなら、どうすればこれを修正できますか?
ありがとう。
編集:これが私が見つけたものです。
基本的に、認証が必要なので、GET リクエストは Authorization ヘッダーを送信しています。ただし、これは「単純な」ヘッダーではないため、ブラウザーはプリフライト リクエスト (OPTIONS) を送信しています。ただし、このプリフライト リクエストには認証がないため、サーバーはそれを拒否していました。「解決策」は、OPTIONSリクエストが認証を必要としないようにサーバーを設定し、HTTPステータス200をサーバーに報告することでした。
参照: http://www.kinvey.com/blog/item/61-kinvey-adds-cross-origin-resource-sharing-cors
mail-archive[.com]/c-user@axis.apache.org/msg00790.html (これ以上のリンクの投稿は許可されていません)
残念ながら、「解決策」は Firefox でのみ機能し、Chrome では機能しません。Chrome は単にリクエストを赤で表示しますが、失敗した理由に関する詳細情報は提供しません。
編集 2: Chrome で修正: データを取得しようとしていたサーバーには、信頼されていないセキュリティ証明書がありました。このため、Chrome でのプリフライト リクエストは失敗しました。解決策 superuser[.com]/questions/27268/how-do-i-disable-the-warning-chrome-gives-if-a-security-certificate-is-not-trust (これ以上のリンクを投稿することは許可されていません)