0

私は 2 つのローカル ドメインで作業しており、両方のドメインの iFrame を使用してシステムをlocalhostテストdomain1しています。postMessaging

windowメッセージを送信して返信を受信するために、(両方のドメインで)それぞれの要素を正しく識別できます。私の問題は、postMessage で送信された 2 番目のパラメーター (メッセージの送信元の URL) が、それぞれの他のドメインのリスナーによって受け入れられないことです。送信者が であると宣言した場合にのみ"*"、メッセージが機能します。

これは、外部ドメインにメッセージを送信しても機能しません:

 // targetWindow = window of foreign domain
 targetWindow.postMessage({
    "foo": "bar"
  }, window.location.href);

これは機能します:

 // targetWindow = window of foreign domain
 targetWindow.postMessage({
    "foo": "bar"
  }, "*");

送信ドメインへの返信についても同じです ( を使用window.top)。これは動作しません:

 window.top.postMessage({
  "baz": "bam"
}, window.location.href.split("?")[0]);

これは次のことを行います:

window.top.postMessage({
  "baz": "bam"
}, "*");

質問:
なぜそうなのですか? 認証を有効にするには、送信 URLを 2 番目のパラメーターとして指定する必要があると考えました。その場合、イベントがトリガーされないのはなぜですか? 私が localhost/domain1 で作業している理由は何ですか?

手伝ってくれてありがとう!

4

1 に答える 1

1

2 番目の pram は targetOrigin です。これは、メッセージの傍受を防ぐためのセキュリティ制限です。メッセージの送信元ではなく、メッセージの送信先のウィンドウのドメインに設定する必要があります。

これは、iframe を使用して 2 番目のフィールドを設定する例です。このフィールドは、iFrame からsrc値を取得し、プロトコル + ドメイン + ポートに分割します。これは、ターゲットの原点を設定するために必要なものです。

var target = iframe.src.split('/').slice(0,3).join('/');
iframe.contentWindow.postMessage('foo', target);
于 2015-09-08T17:19:27.973 に答える