ホームページ > 記事 > ウェブフロントエンド > JSのクロスドメイン問題を詳しく解説_基礎知識
JavaScript は、Web 開発でよく使用されるフロントエンドの動的スクリプト技術です。 JavaScript には、「同一オリジン ポリシー」と呼ばれる非常に重要なセキュリティ制限があります。このポリシーは、JavaScript コードがアクセスできるページ コンテンツに重要な制限を設けます。つまり、JavaScript は、それを含むドキュメントと同じドメイン内のコンテンツにのみアクセスできます。
JavaScript のセキュリティ戦略は、Ajax プログラミングだけでなく、マルチ iframe またはマルチウィンドウ プログラミングを実行する場合にも特に重要です。このポリシーによれば、baidu.com のページに含まれる JavaScript コードは、google.com ドメイン名のページ コンテンツにアクセスできません。また、異なるサブドメイン間のページであっても、JavaScript コードを介して相互にアクセスすることはできません。 Ajax への影響は、XMLHttpRequest によって実装された Ajax リクエストが別のドメインにリクエストを送信できないことです。たとえば、abc.example.com の下にあるページは、def.example.com などに Ajax リクエストを送信できません。
ただし、詳細なフロントエンド プログラミングを行う場合、クロスドメイン操作が必然的に必要になります。現時点では、「同一生成元ポリシー」は厳しすぎるようです。この記事では、この問題に関するクロスドメインに必要ないくつかのテクノロジーをまとめます。
次に、クロスドメイン テクノロジーについて 2 つの状況で説明します。最初に、異なるサブドメインでのクロスドメイン テクノロジーについて説明し、次に完全に異なるドメインでのクロスドメイン テクノロジーについて説明します。
(1) 異なるサブドメインのクロスドメイン テクノロジー。
2 つの質問を個別に説明します。最初の質問は、異なるサブドメイン間で JavaScript 呼び出しを行う方法であり、2 番目の質問は、異なるサブドメインに Ajax リクエストを送信する方法です。
まず最初の問題を解決しましょう。example.com ドメインの下に abc.example.com と def.example.com という 2 つの異なるサブドメインがあるとします。ここで、def.example.com の下に JavaScript 関数を定義するページがあるとします:
abc.example.com の下のページで上記の関数を呼び出したいと考えています。議論したい abc.example.com の下のページが iframe の形式で def.example.com の下のページに埋め込まれていると仮定します。この場合、iframe で次の呼び出しを試みることができます。 >
上記の呼び出しを実装するには、2 つのページのドメイン属性を変更することで実行できます。たとえば、次の JavaScript コード スニペットを abc.example.com と def.example.com の上の 2 つのページの先頭に追加できます:
このようにして、2 つのページは同じドメインになり、前の呼び出しは正常に実行できるようになります。
上の例では、2 つのページが iframe のネストされた関係に属している場合について説明しています。2 つのページにオープンとオープンの関係がある場合、原理はまったく同じです。
次に 2 番目の問題、つまり Ajax リクエストを異なるサブドメインに送信する方法を解決しましょう。
通常、次のようなコードを使用して XMLHttpRequest オブジェクトを作成します。
上記のコードは、IE6 シリーズ ブラウザとの互換性を保つために ActiveXObject を参照しています。 newRequest 関数を呼び出すたびに、新しく作成された Ajax オブジェクトを取得し、この Ajax オブジェクトを使用して HTTP リクエストを送信します。たとえば、次のコードは GET リクエストを abc.example.com に送信します:
上記のコードが abc.example.com ドメイン名のページに含まれていると仮定すると、GET リクエストは問題なく正常に送信できます。ただし、def.example.com にリクエストを送信すると、クロスドメインの問題が発生し、JavaScript エンジンが例外をスローします。
解決策は、crossdomain.html という名前のクロスドメイン ファイルを def.example.com ドメインの下に配置し、前の newRequest 関数の定義をこのクロスドメイン ファイルに移動することです。ドキュメントのドメイン値は同じです。crossdomain.html ファイルと、abc.example.com ドメインの下で Ajax を呼び出すページの先頭に、
を追加します。[コード]
http://def.example.com/crossdomain.html">>
この時点では、abc.example.com ドメイン下のページとクロスドメイン ファイルcrossdomain.html は両方とも同じドメイン (example.com) にあり、abc.example 下のページ内でクロスドメインを呼び出すことができます。 .com ドメイン。HTML の newRequest 関数:
この方法で取得したリクエスト オブジェクトは、http://def.example.com に HTTP リクエストを送信できます。
(2) 全く異なるドメインにおけるクロスドメイン技術。
トップレベル ドメイン名が異なる場合、たとえば example1.com と example2.com が JavaScript を介してフロントエンドで通信したい場合、必要なテクノロジはより複雑になります。
異なるドメインのクロスドメイン技術を説明する前に、異なるサブドメインをまたぐことは特殊なケースにすぎないため、以下で説明する技術は異なるサブドメインにわたる前の状況にも適用できることをまず明確にしましょう。クロスドメインの問題。もちろん、適切な状況下で適切なテクノロジーを使用すると、より高い効率とより高い安定性を確保できます。
つまり、さまざまなクロスドメインのニーズに応じて、クロスドメイン テクノロジーは次のカテゴリに分類できます。
1. JSONP クロスドメイン GET リクエスト
2. iframe を通じてクロスドメインを実現
3. Flash クロスドメイン HTTP リクエスト
4. window.postMessage
この記事はまずここで終わります。上記の 4 つのクロスドメイン テクノロジーについては後ほど詳しく紹介します。