2012-01-31 112 views
5

我知道跨瀏覽器域調用的解決方案。使用JSONP,進行代理調用,或接受服務器上的域。今天在我的公司發現了更多奇怪的方式。iframes跨域問題

方法:

他們正在改變主機通過使用第二服務器的主機匹配這個 -

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

然後,他們正在創建一個隱藏的iframe和iframe中獲取內容並更換內容可見元件。

問題:

它的工作原理是iframe,但如果我這樣做Ajax調用,這是行不通的。對此有何話語?

+0

這聽起來像一個錯誤或漏洞。你測試過哪些瀏覽器? – Halcyon 2012-01-31 20:23:04

+0

它適用於IE,Chrome。我沒有在Firefox中測試 – emphaticsunshine 2012-01-31 20:24:57

+3

我不確定'window.location.host',但更改'document.domain'確實允許同一父域中的兩個不同的子域進行通信。 https://developer.mozilla.org/zh/Same_origin_policy_for_JavaScript – djd 2012-02-08 02:07:51

回答

3

我不是JSONP的粉絲,它創建的數據和表現之間的耦合,所以我之前研究這個問題,那麼,有一個技巧,你可以使用,按照這個:

假設我們有主窗口命名爲A和B.命名 A和B必須來自同一個主機提供的iframe的「孩子」窗口,但可以有不同的子域,是這樣的:

A從SUB1服務.example.com

B由sub2.example.com提供

瀏覽器讓你修改文檔的領域,但仍然限制你在那,所以你只能通過直至到達主機中移除子域更改域,並因此在您更改域名,如所以:

document.domain = "example.com"; 

B中你第一次做一個AJAX調用其領域(sub2.example.com),然後將第一個請求發送後您更改域名就像一個,因此這兩個文檔有相同的域。 由於您向B中的原始域發出了請求,因此瀏覽器將允許您繼續向其發送請求,但由於您也更改了域,現在A和B具有相同的域,因此它們可以相互通信。

在更改域之前,首先在B中將至少一個請求發送到其原始域是很重要的。 同樣,如果兩個頁面不是從同一個主機提供的,它不會工作,所以在大多數情況下它不能解決問題,但它確實讓您有更多的操作空間。

我不止一次使用過這個技巧,並且沒有遇到任何問題,據我所知,它在所有瀏覽器中都可以使用,如果在某些情況下它不適用,請告訴我。

這裏有一個僞例如:

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 2012-02-13 20:05:05

+0

你必須先做一個ajax調用,然後才能更改域名,否則,因爲在更改域名之前ajax請求,由於安全策略,請求將失敗。如果我理解你的解決方案,那麼它就像jsonp一樣,限制iframe源只能從同一主機提供。 – 2012-02-13 23:52:47