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リクエストを実装したもので、実際にはタイムアウトやその他のパラメータを設定することもできます。