JavaScriptのクロスドメイン問題対応方法
皆さん、こんにちは。笹亀です。
しばらく立て混んでいた関係でブログがかけませんでした。
久しぶりにブログを書かせていただきます。
JavaScriptでいろいろと実装しているとき、別ウィンドでページを呼び出し、その別ウィンドーと呼び出しウィンドー間にて通信を行うといったときによくクロスドメイン問題に悩ま されます。
今回はそのようなクロスドメイン問題を解決する方法についてご紹介します。
そもそもクロスドメインとは、異なるドメイン間をまたがったデータに対してアクセスをすることをいいます。
Webアプリケーションを設置・公開するホストのドメインと、そのアプリケーションがアクセスするWebサービスのドメインが、サブドメインやポート番号も含め異なる場合は、JavaScriptなどでのデータのアクセスは遮断されます。
JavaScriptにてクロスドメイン間の通信をする場合には、JSONPを利用して行う方法もございますが、今回はHTML5より利用できるようになった、postMessageにてクロスドメイン間のデータの通信方法についてご紹介します。
データの流れについては下記のようなイメージになります。
次に上記の流れについては実際にテスト的に実装をしてみます。
まずは別ウィンドーで開く側のHTMLを作成します。
1.Web Site Bのサイトを別ウィンドーで呼び出す
2.1で呼び出したウィンドーオブジェクトを利用してpostMessageで通信をする
※必ずHTML5の記法で記載をします
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS_CrossDomainテスト</title>
<script language="javascript">
<!--
var winEntPopup;
//メッセージが送られたときに反応するイベントリスナー
window.addEventListener("message", receiveData, false);
//データを受け取る関数
function receiveData(e) {
document.FormTest.bro_info.value =e.data;
}
//ポップアップで呼び出し
function fnc_popupWindow(varUrl) {
wFeatures = "resizable=yes,status=yes,location=no,directories=no,menubar=no,scrollbars=yes,toolbar=no,width=1000,height=700,left=100,top=100";
winEntPopup = window.open(varUrl, "testpopup", wFeatures);
winEntPopup.focus();
//読み込みまで待つため、あえて5秒後に問い合わせる
setTimeout("execute();", 5000);
}
function execute() {
winEntPopup.postMessage('こんにちは、小ウィンドーさん!通信できましたね!', '*');
}
-->
</script>
</head>
<body>
<h3>データ通信テスト用</h3>
<form method="POST" name='FormTest'>
<input type="button" value="