Flashを使ってJavaScriptで半クロスドメイン通信 - ヒルズで働く@robarioの技ログ
やっぱり「swfの読み込み完了を待つ」「完了時のコールバックを指定する」というのがちょっといただけないので、send()を遅延実行するタイプに戻した。なのでファイル2個になりました。
この2つのファイルを同じディレクトリに突っ込んで、CrossDomainXMLHttpRequest.jsを読み込めばOK。
何で「半クロスドメイン」かというと、通信先のcrossdomain.xmlによって許可されている必要があるから『半』なのです。crossdomain.xmlを設置する側の人はcrossdomain.xml と CSRF 脆弱性について - 2nd lifeもどうぞ。
サンプルはこんな感じ。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>CrossDomainXMLHttpRequest</title> <script type="text/javascript" src="CrossDomainXMLHttpRequest.js"></script> <script type="text/javascript"> XMLHttpRequest = CrossDomainXMLHttpRequest; var req = new XMLHttpRequest(); req.open('GET', 'http://twitter.com/statuses/public_timeline.xml', true); req.setRequestHeader('content-type', 'application/x-www-form-urlencoded; charset=UTF-8'); req.onreadystatechange = function() { if (req.readyState != 4) { return; } alert(req.responseText); }; req.send(''); </script> </head> <body> </body> </html>
別に"var req = new CrossDomainXMLHttpRequest();"でもいいんだけど。例えば「何かURIを渡すと、XMLHttpRequest使って読み込んでごにょごにょしてくれる外部スクリプト」を読み込む前に"XMLHttpRequest = CrossDomainXMLHttpRequest;"とかしておくと、スクリプトをいじらずに半クロスドメイン対応ができます、ってことをちょっと言いたかった。"XMLHttpRequest = JSONScriptRequest;"とかしてみたりとかね。
JavaScriptって面白いなー。
特長とか
- ポリシーファイルが/crossdomain.xmlじゃ無い場合、CrossDomainXMLHttpRequest.addPolicyFileを使って追加できます。
- 今のところsynchronousはできません。
- CrossDomainXMLHttpRequest.js、CrossDomainXMLHttpRequest.swfは、この名前のままで、同じディレクトリに置かないとダメ
作業中
- swfファイルの場所を指定できないのでHTMLと同じところにおかないとダメ
- 場所を指定できるようにする
- jsファイルのある位置をデフォルト位置にする
- レスポンスヘッダの処理
- 通信エラー発生時の処理
- readyState==3(LODING)のときにresponseTextを取れるようにする(これはやらないかも?いらないよね?)
- abort処理
- statusTextの処理
- statusの処理の見直し
- 名前を決める(CrossDomainXMLHttpRequestは長ったらしい。FlashXMLHttpRequest?うーん)
- Cookieの処理
- イベントディスパッチャの実装
- synchronousなsend
- responseXMLとか実装