2012-01-31 26 views
5

私はクロスブラウザドメインコールの解決策を知っています。 JSONPを使用するか、プロキシ呼び出しを行うか、サーバー上のドメインを受け入れます。私は今日私の会社で1つの奇妙な方法を見つけました。iframeを使用したクロスドメインの問題

方法:

彼らはこれを用いて第2のサーバのホストと一致するようにホストを変更する -

window.location.host = "xyz.com"; 
      or 
document.domain = "xyz.com"; 

そしてそれらが非表示のiframeを作成し、iframe内のコンテンツを取得し、可視にコンテンツを交換します素子。

問題:

それはインラインフレームで動作しますが、私はAJAX呼び出しを行う場合、それは動作しません。これに関する言葉?

+0

これはバグやエクスプロイトのように聞こえる:

はここに擬似例です。あなたはこれをどのブラウザでテストしましたか? – Halcyon

+0

IE、Chromeで動作します。私はfirefoxでテストしなかった – emphaticsunshine

+3

'window.location.host'についてはわかりませんが、' document.domain'を変更すると、同じ親ドメイン上の2つの異なるサブドメインが通信できるようになりました。 https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript – djd

答えて

3

私はJSONPのファンではない、それはデータとプレゼンテーションの間の結合を作成し、私は前にこの問題を調査し、まあ、あなたが使用できるトリックがあります、これに従ってください:

のは、私たちをしましょうB. Aという名前のiframe内にAという名前のメインウィンドウと「子」のウィンドウを持っているとBが同じホストから提供されなければならないが、別のサブドメインを持つことができる、のようなもの:

AがSUB1から提供しています.example.com

Bは、sub2.example.comから配信されます。

ブラウザではドキュメントのドメインを変更できますが、それでも制限があるので、ホストに到達するまでサブドメインを削除してドメインを変更することができます。そう:

document.domain = "example.com"; 
あなたが最初にそのドメインへのAJAX呼び出し(sub2.example.com)最初の要求が送られた後、あなたは両方のドキュメントを持っているように、ちょうどAのようにドメインを変更をするBに

同じドメイン。 Bの元のドメインにリクエストを行ったので、ブラウザはリクエストを送信し続けることができますが、ドメインを変更してAとBも同じドメインを持ち、互いに通信できます。

ドメインを変更する前に、最初に少なくとも1つのリクエストを元のドメインに変更することが重要です。 また、両方のページが同じホストから提供されていない場合は機能しません。ほとんどの場合、問題は解決しませんが、もう少し余裕で操作できます。

私はこのトリックを2回以上使用していますが、問題が発生していない限り、すべてのブラウザで動作していることがわかっています。

in A 
================== 
document.domain = "example.com"; 
var child; // keep reference to B 
function setChild(win) { 
    childDocument = win; 
} 

function handleMessage(message) { 
    do what ever it is you need to 
} 

in B 
================== 
make ajax request 
document.domain = "example.com"; 
parent.setChild(this); 

function ajaxCallback(message) { 
    parent.handleMessage(message); 
} 
+0

私もそれを試みます。しかし、私はドメインを変更するだけでAJAXを試みましたが、早く私にはうまくいきませんでした。しかし、私はこのように試してみます。 Iframeは、サブドメインコールの場合は正常に動作します。あなたはここで解決策を見つけることができます:https://github.com/emphaticsunshine/Cross-sub-domain-solution – emphaticsunshine

+0

あなたは最初にajax呼び出しを行う必要があります。そうしないと、ドメインを変更することができますajaxリクエストの場合、リクエストはセキュリティポリシーのために失敗します。あなたのソリューションを理解していれば、iframeソースは同じホストからしか提供できないという制限があり、jsonpとまったく同じです。 –

関連する問題