Orbited (Cometサーバー)のクライアント側JSコンポーネントでは、サーバーがJS自体とは異なるドメインまたはポートで実行されている場合、実行する必要があります。
document.domain = document.domain;
他のJSがロードされる前。 ( ドキュメント を参照してください。)
これは何をしますか? NOOPのように見えます! (チェックしましたが、実際に必要です。)
私は実際にこのコードを書きました。
クロスサブドメイン/ポートコメットを実行する場合、iframeには親フレームと同じdocument.domain
値が必要です。残念ながら、ブラウザは元のdocument.domain
値のドメイン名とポートを内部に保存します。しかし、javascriptのゲッターとセッターはポートについて何も知りません。問題はこれです:上のフレームdocument.domain
が('example.com', 80)
で、下のフレームが('comet.example.com', 80)
である場合、下のフレームも('example.com', 80)
にするにはどうすればよいですか?
ホスト名の部分を変更すると必ずポートがnull
に設定されるため、できないので、できることは一番下のフレームの('example.com', null)
です。したがって、トップフレームもその値に設定する必要があり、document.domain=document.domain
を設定するだけでそれが行われます。ブラウザの内部表現を('example.com', 80)
から('example.com', null)
に変更すると、すべてが一致し、クロスポート/サブドメインフレーム通信が機能します。
ブラウザは、(a)明示的に設定されていない場合のdocument.domainと(b)明示的に設定されている場合のdocument.domainを区別します...同じ値を返す場合でも。
値を明示的に設定することは、別のサブドメイン(同じ親ドメインの下)のスクリプトと「協力する」意図を示します。
親ページと外部スクリプトの両方がdocument.domainを同じ値に明示的に設定した場合、同一生成ポリシーの制限はバイパスされ、各スクリプトは互いのコンテキストのすべての(他の制限された)オブジェクトとプロパティにアクセスできます。
このサイトで次の情報を見つけました: devgur 。より具体的には、引用は次のとおりです。
このプロパティは、ドキュメントの作成元のサーバーのドメイン名を設定または返します。これはデフォルトで、ドキュメントが取得されたサーバーのドメイン名になりますが、この名前のサフィックス(およびサフィックスのみ)に変更できます。これにより、同じドメインサフィックスを共有する異なるサーバーから配信されたドキュメント間で、スクリプトプロパティを共有し、セキュリティを確保できます。
(サブドメインが異なっていても)同じドメインのクロスサイトスクリプティングを許可するように思えます。
Document.domainに触れない場合、jsエンジンは同じドメインの他のjavascriptのみを許可すると思います。そのプロパティを使用すると、オービットドキュメントの状態など、他のサブドメインにデプロイできます。
document.domain
は、明示的に設定されていない場合、実際のURLからデフォルトを取得します。ブラウザは、document.domain
は、URLのデフォルトとして、または明示的に設定されている場合に提供されます。両方を同じドメインのデフォルトにするか、これを機能させるために両方を同じドメインに明示的に設定する必要があります。 1つがデフォルトで、1つが明示的に設定されている場合、両方が読み取られた場合に一致しますが、2つのページが互いに会話することは禁止されます。
参照: https://developer.mozilla.org/en-US/docs/DOM/document.domain