blog

jsonpの概念原理と実装

ブラウザは、同じ起源のポリシーは、彼はまた、コアコンテンツだけでなく、セキュリティの最高の保証である大会です。このような制限がない場合を想像すると、ページが同時にロードされ、jsファイルの下に2つのド...

Jan 11, 2021 · 2 min. read
シェア

jsonp

、なぜクロスドメインなのか

ブラウザは、同じ起源のポリシーは、彼はまた、最もコアなコンテンツだけでなく、セキュリティの最高の保証である大会です。このような制限がない場合を想像すると、ページが同時にロードされたjsファイルの下にaとbの2つのドメインは、その文書とクッキー情報を共有されている、つまり、aは情報の下にbのドメインを取得することができ、その逆bは情報の下にドメインを取得することができます、このような結果は非常に恐ろしいです!

同じソースの概念

どちらのページもプロトコル、ホスト、ポート番号は同じです。以下のコードをコンソールにコピーして実行し、結果を見ることができます。

console.log(location.protocal); // 現在のページのプロトコルを表示する console.log(location.hostname); // ドメイン名の現在のページを表示する console.log(location.port); // 現在のページアクセスのポート番号を表示する

ポート番号は主に80(http)、443(https)です。

jsonpの実装原理

jsonpの実装は、実際にはヘッダにscriptタグを挿入し、ウィンドウにメソッドを追加します。スクリプトのリクエストが返ってくると、返された内容が実行されます。戻り値はウィンドウに追加されたメソッドです。

例えば

メソッドセットがjsonpCb1であり、インターフェイスによって返される実際のデータがhello worldである場合、ロードされたリクエストによって返される実際のデータはjsonpCb1('hello world')です。

jsonp実装メソッド

let count = 0; // すべてのリクエストのコールバック関数が同じでないことを保証するために、カウンタを展開することができる function jsonp(url, params, callback){ let script = document.createElement('script'); let cb = `callback${count++}`; // 実際のバックエンドは、このパラメータに応じてメソッドの名前を返す url += url.includes('?') ? `&callback=${cb}` : `?callback=${cb}`; script.src = url; function clean() { script.parentNode.removeChild(script); // スクリプトタグを削除する window[cb] = null; // コールバック関数をnullに設定する } // 実際のリクエストは、データを取得することに成功した window[cb] = result => { cleanup(); callback(null, result); }; // リクエストのレスポンス // リクエストエラーのリスニング script.onerror = function(e) { cleanup(); callback(e, null); }; document.head.appendChild(script); // domに挿入され、実際のリクエスト }

上記はおそらく単純なjsonpリクエストを実装したもので、実際にはタイムアウトやその他のパラメータを設定することもできます。

Read next

[MyBatis]条件アノテーション

クエリで使用される比較記号をすばやく定義するために、ドメインクラスのプロパティのConditionアノテーションを使用することができます。 ここでは、演算子は、特定の条件が> = <のような "値を与えられたフィールド名演算子 "になることを制限していない、デフォルトの=は、また、"のように "設定することができますautoWrapファジィクエリ。 オートラップ...

Jan 11, 2021 · 2 min read