目次
クロスドメインとは何ですか?プロトコル、ドメイン名、ポートが異なれば、別のドメインとみなされます。
Cross-Origin Resource Sharing (CORS)
jsonp を介したクロスドメイン
JSONP の長所と短所
CORS と JSONP の比較
document.domain を変更してサブドメインを横断する
使用window.name来进行跨域
使用HTML5的window.postMessage方法跨域
ホームページ ウェブフロントエンド jsチュートリアル js を使用してクロスドメインの問題を解決する例を共有する

js を使用してクロスドメインの問題を解決する例を共有する

Mar 13, 2018 pm 03:22 PM
javascript 共有

クロスドメインとは何ですか?プロトコル、ドメイン名、ポートが異なれば、別のドメインとみなされます。

URL                      说明       是否允许通信
http://www.a.com/a.jshttp://www.a.com/b.js    
 同一域名下   
 允许http://www.a.com/lab/a.jshttp://www.a.com/script/b.js 同一域名下不同文件夹 
 允许http://www.a.com:8000/a.jshttp://www.a.com/b.js     同一域名,不同端口  
 不允许http://www.a.com/a.jshttps://www.a.com/b.js 同一域名,不同协议 
 不允许http://www.a.com/a.jshttp://70.32.92.74/b.js 域名和域名对应ip 
 不允许http://www.a.com/a.jshttp://script.a.com/b.js 主域相同,子域不同 
 不允许http://www.a.com/a.jshttp://a.com/b.js 同一域名,不同二级域名(同上) 
 不允许(cookie这种情况下也不允许访问)http://www.cnblogs.com/a.jshttp://www.a.com/b.js 
 不同域名 不允许
ログイン後にコピー

ポートとプロトコルの違いは、バックグラウンドでのみ解決できます。

Cross-Origin Resource Sharing (CORS)

CORS (Cross-Origin Resource Sharing) クロスドメイン リソース共有は、クロスドメイン リソースにアクセスするときにブラウザとサーバーが通信する方法を定義します。 CORS の背後にある基本的な考え方は、カスタム HTTP ヘッダーを使用して、ブラウザーがサーバーと通信して、要求または応答が成功するか失敗するかを判断できるようにすることです。

<script type="text/javascript">
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "/trigkit4",true);
    xhr.send();</script>
ログイン後にコピー

上記の trigkit4 は相対パスです。CORS を使用する場合、関連する Ajax コードは次のようになります。

<script type="text/javascript">
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://segmentfault.com/u/trigkit4/",true);
    xhr.send();</script>
ログイン後にコピー

このコードと前のコードの違いは、相対パスが絶対パスに置き換えられることです。つまり、ドメインにアクセスするにはインターフェイス アドレスを越える必要があります。

サーバー側は主に Access-Control-Allow-Origin を設定することで CORS をサポートします。ブラウザーが対応する設定を検出すると、Ajax クロスドメイン アクセスを許可できます。


クロスドメインの問題を解決するには、次の方法を使用できます:

jsonp を介したクロスドメイン

さて、質問が来ますか? jsonpとは何ですか? Wikipedia の定義は次のとおりです。 JSONP (JSON with Padding) は、データ形式 JSON の「使用モード」であり、Web ページが他のドメインからデータを要求できるようにします。

JSONP (パデッド JSON とも呼ばれます) は、関数呼び出しに JSON が含まれているだけの JSON を適用する新しい方法です。例:

callback({"name","trigkit4"});
ログイン後にコピー

JSONP は、コールバック関数とデータの 2 つの部分で構成されます。コールバック関数は、応答が来たときにページ内で呼び出される関数であり、データはコールバック関数に渡される JSON データです。

js では、XMLHttpRequest を直接使用して、異なるドメインのデータをリクエストすることはできません。ただし、jsonp はこの機能を使用してページ上に異なるドメインの js スクリプト ファイルを導入することができます。 例:

<script type="text/javascript">
    function dosomething(jsondata){        //处理获得的json数据
    }</script><script src="http://example.com/data.php?callback=dosomething"></script>
ログイン後にコピー

js ファイルが正常に読み込まれた後、url パラメーターで指定した関数が実行され、必要な json データがパラメーターとして渡されます。したがって、jsonp はサーバー側ページからの対応する連携を必要とします。

<?php$callback = $_GET[&#39;callback&#39;];//得到回调函数名$data = array(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;);//要返回的数据echo $callback.&#39;(&#39;.json_encode($data).&#39;)&#39;;//输出?>
ログイン後にコピー

最終的に、出力結果は次のようになります: dosomething(['a','b','c']);

ページで jquery を使用している場合は、そのカプセル化されたメソッドを通じて jsonp 操作を簡単に実行できます。

<script type="text/javascript">
    $.getJSON(&#39;http://example.com/data.php?callback=?,function(jsondata)&#39;){        //处理获得的json数据
    });</script>
ログイン後にコピー

jquery は、callback=? の疑問符を置き換えるグローバル関数を自動的に生成し、データを取得した後、それを自動的に破棄します。実際には、これは一時的なプロキシ関数として機能します。 $.getJSON メソッドは、クロスドメインであるかどうかを自動的に判断し、そうでない場合は通常の ajax メソッドを呼び出します。クロスドメインである場合は、js ファイルを非同期にロードする形式で jsonp コールバック関数を呼び出します。

JSONP の長所と短所

JSONP の利点は次のとおりです。XMLHttpRequest オブジェクトによって実装される Ajax リクエストのような同一生成元ポリシーによって制限されず、互換性が高く、XMLHttpRequest や ActiveX をサポートしていなくても古いブラウザーで実行できます。リクエストが完了したら、コールバックを呼び出すことで結果を返すことができます。

JSONP の欠点は、GET リクエストのみをサポートし、POST などの他のタイプの HTTP リクエストはサポートしないこと、クロスドメイン HTTP リクエストのみをサポートし、異なるドメインの 2 つのページ間で JavaScript 呼び出しを行う方法を解決できないことです。

CORS と JSONP の比較

JSONP と比較すると、CORS は間違いなくより高度で、便利で、信頼性が高くなります。

    1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
    2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
    3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS)。
ログイン後にコピー

document.domain を変更してサブドメインを横断する

ブラウザーにはすべて同一生成元ポリシーが適用されます。その制限の 1 つは、最初の方法で、異なるソースからのドキュメントを ajax 経由でリクエストできないことです。 2 番目の制限は、js がブラウザー内の異なるドメインのフレーム間で対話できないことです。
異なるフレームワーク間ではウィンドウオブジェクトは取得できますが、対応するプロパティやメソッドは取得できません。たとえば、アドレスが http://www.example.com/a.html であるページがあり、このページには iframe があり、その src は明らかに http://example.com/b.html です。ページとその内部の iframe フレームは異なるドメインにあるため、ページに js コードを記述しても iframe 内の情報を取得することはできません:

<script type="text/javascript">
    function test(){        var iframe = document.getElementById(&#39;ifame&#39;);        var win = document.contentWindow;//可以获取到iframe里的window对象,但该window对象的属性和方法几乎是不可用的
        var doc = win.document;//这里获取不到iframe里的document对象
        var name = win.name;//这里同样获取不到window对象的name属性
    }</script><iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe>
ログイン後にコピー

このとき、document.domain が便利です。ドキュメントを設定するだけです。 http://www.example.com/a.html と http://example.com/b.html の 2 つのページのドメインを同じドメイン名に変更します。ただし、document.domain の設定は制限されており、document.domain はそれ自体または上位レベルの親ドメインにのみ設定でき、メイン ドメインは同じである必要があることに注意してください。

1.在页面 http://www.example.com/a.html 中设置document.domain:

<iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe><script type="text/javascript">
    document.domain = &#39;example.com&#39;;//设置成主域
    function test(){
        alert(document.getElementById(&#39;iframe&#39;).contentWindow);//contentWindow 可取得子窗口的 window 对象
    }</script>
ログイン後にコピー

2.在页面 http://example.com/b.html 中也设置document.domain:

<script type="text/javascript">
    document.domain = &#39;example.com&#39;;//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同</script>
ログイン後にコピー

修改document.domain的方法只适用于不同子域的框架间的交互。

使用window.name来进行跨域

window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的

使用HTML5的window.postMessage方法跨域

window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

相关推荐:

php关于ajax跨域问题解析

关于javascript中跨域问题的解决办法分享

关于js跨域问题的总结

以上がjs を使用してクロスドメインの問題を解決する例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Quark NetdiskをBaidu Netdiskに共有するにはどうすればよいですか? Quark NetdiskをBaidu Netdiskに共有するにはどうすればよいですか? Mar 14, 2024 pm 04:40 PM

Quark Netdisk と Baidu Netdisk は非常に便利なストレージ ツールですが、多くのユーザーはこれら 2 つのソフトウェアが相互運用可能かどうかを疑問に思っています。 Quark NetdiskをBaidu Netdiskに共有するにはどうすればよいですか?このサイトでは、QuarkネットワークディスクファイルをBaiduネットワークディスクに保存する方法をユーザーに詳しく紹介します。 Quark Network Disk から Baidu Network Disk にファイルを保存する方法 方法 1. Quark Network Disk から Baidu Network Disk にファイルを転送する方法を知りたい場合は、まず Quark Network Disk に保存する必要があるファイルをダウンロードして、次に開きますBaidu Network Disk クライアントを起動し、圧縮ファイルを保存するフォルダーを選択し、ダブルクリックしてフォルダーを開きます。 2. フォルダーを開いたら、ウィンドウ左上の「アップロード」をクリックします。 3. コンピュータ上でアップロードする必要がある圧縮ファイルを見つけ、クリックして選択します。

NetEase Cloud Music を WeChat Moments に共有する方法_NetEase Cloud Music を WeChat Moments に共有するチュートリアル NetEase Cloud Music を WeChat Moments に共有する方法_NetEase Cloud Music を WeChat Moments に共有するチュートリアル Mar 25, 2024 am 11:41 AM

1. まず、NetEase Cloud Music に入り、ソフトウェアのホームページ インターフェイスをクリックして、曲の再生インターフェイスに入ります。 2. 次に、曲の再生インターフェイスで、下の図の赤いボックスに示すように、右上隅にある共有機能ボタンを見つけて、クリックして共有チャンネルを選択し、共有チャンネルで「共有先」オプションをクリックします。下部にある [WeChat Moments] を選択すると、コンテンツを WeChat Moments に共有できます。

Baidu Netdisk で友達とファイルを共有する方法 Baidu Netdisk で友達とファイルを共有する方法 Mar 25, 2024 pm 06:52 PM

最近、Baidu Netdisk Android クライアントの新しいバージョン 8.0.0 がリリースされ、このバージョンには多くの変更が加えられただけでなく、多くの実用的な機能も追加されました。その中でも最も目を引くのがフォルダー共有機能の強化だ。ユーザーは簡単に友人を招待して仕事や生活で重要なファイルを共有できるようになり、より便利なコラボレーションと共有が実現します。では、友達と共有する必要があるファイルをどのように共有すればよいでしょうか? 以下では、このサイトの編集者が詳しく説明します。 1) Baidu Cloud APP を開き、まずホームページ上の関連フォルダーをクリックして選択し、次にインターフェイスの右上隅にある [...] アイコンをクリックします (以下を参照) 2) 次に、[+] をクリックします。 「共有メンバー」欄】を選択し、最後に全てにチェックを入れます

Mango TV メンバーのアカウント共有 2023 Mango TV メンバーのアカウント共有 2023 Feb 07, 2024 pm 02:27 PM

Mango TV には、さまざまな種類の映画、テレビシリーズ、バラエティ番組などのリソースがあり、ユーザーはそれらを自由に選択して視聴できます。 Mango TV 会員はすべての VIP ドラマを視聴できるだけでなく、ユーザーが楽しくドラマを視聴できるように最高解像度の画質を設定することもできます。以下では、編集者がユーザーが使用できる無料の Mango TV 会員アカウントをいくつか紹介します。急いで見てください。見てください。 Mango TV 最新のメンバー アカウント無料共有 2023: 注: これらは収集された最新のメンバー アカウントです。直接ログインして使用できます。パスワードを自由に変更しないでください。口座番号: 13842025699 パスワード: qds373 口座番号: 15804882888 パスワード: evr6982 口座番号: 13330925667 パスワード: jgqae 口座番号: 1703

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

HP プリンター ドライバーの 2 つのインストール方法を共有する HP プリンター ドライバーの 2 つのインストール方法を共有する Mar 13, 2024 pm 05:16 PM

HP プリンターは多くのオフィスで欠かせない印刷機器であり、コンピューターにプリンター ドライバーをインストールすると、プリンターが接続できないなどの問題を完全に解決できます。では、HP プリンター ドライバーをインストールするにはどうすればよいでしょうか?以下のエディターでは、2 つの HP プリンター ドライバーのインストール方法を紹介します。 1 つ目の方法: 公式 Web サイトからドライバーをダウンロードする 1. 検索エンジンで HP 中国公式 Web サイトを検索し、サポート欄で [ソフトウェアとドライバー] を選択します。 2. [プリンター] カテゴリを選択し、検索ボックスにプリンターのモデルを入力し、[送信] をクリックしてプリンター ドライバーを見つけます。 3. お使いのコンピューター システムに応じて対応するプリンターを選択します (win10 の場合は、win10 システム用のドライバーを選択します)。 4. ダウンロードが成功したら、フォルダー内でそれを見つけます

トマトの小説リンクの共有方法 トマトの小説リンクの共有方法 Feb 27, 2024 pm 04:20 PM

トマトノベルスは、質の高い小説素材を数多く集めた小説の宝庫です。ここでは、たくさんの種類の小説の中から自分の好みに合わせて好きな小説を選ぶことができます。読書好きの人にとっては、まさに自由に飛べる文学の世界であることは間違いありません。お気に入りの読み物に出会ったとき、それを友達と共有して一緒に読みたいと思うことがありますが、多くのユーザーはそれを共有する方法を正確に知りません。そのため、このチュートリアル ガイドでは、次のようなプレイヤー向けにガイドの詳細な紹介を提供します。もっと詳しく この記事と合わせて読んでみてください!トマトの小説を友達と共有するにはどうすればよいですか? 1. Tomato Novel を開き、クリックして小説に入り、右上隅の共有アイコンをクリックします。 2. 共有チャンネルを選択します ここでは WeChat の友達への共有を例に挙げます。 3. 「共有」をクリックします。 4. 確認できます

Discuz WeChat共有が表示できない問題を解決 Discuz WeChat共有が表示できない問題を解決 Mar 09, 2024 pm 03:39 PM

タイトル: Discuz WeChat の共​​有が表示されない問題を解決するには、具体的なコード例が必要です モバイル インターネットの発展に伴い、WeChat は人々の日常生活に欠かせないものになりました。 Web サイト開発では、ユーザー エクスペリエンスを向上させ、Web サイトの露出を拡大するために、多くの Web サイトに WeChat 共有機能が統合され、ユーザーが Web サイトのコンテンツを Moments または WeChat グループに簡単に共有できるようになります。ただし、Discuz などのオープンソース フォーラム システムを使用すると、WeChat 共有が表示されないという問題が発生し、ユーザー エクスペリエンスに一定の困難が生じることがあります。

See all articles