2010-04-23 266 views

回答

10

您正針對同源策略運行。您正在訪問的Web服務必須與發出請求的jQuery腳本位於同一個域中。所有瀏覽器都強制執行此策略,以防止 - 例如 - 跨網站腳本和代碼注入攻擊Web應用程序。

它有各種各樣的方法,包括JSONP,代理或Flash。

在我們可以建議您應該使用哪種技術之前,我們需要更多信息。我傾向於支持JSONP。不過在此之前,這裏是一些輕閱讀:

http://taossa.com/index.php/2007/02/08/same-origin-policy/

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript

下面是一個例子使用JSONP的:

url = "http://www.test.com/getData.php?callback=parseResults"; 

document.body.appendChild((function() { 
    var newScript = document.createElement("script"); 
    newScript.type = "text/javascript"; 
    newScript.src = url; 
    return newScript; 
})()); 

function parseResults(data) { 
    alert(data); 
} 
+0

那麼你是否會對同一個域上的服務進行ajax調用,並將請求轉發給預期的服務?但是,從服務器端代碼那裏沒有瀏覽器強加的限制嗎? – ChrisCa 2010-04-23 10:04:51

+3

如果你正在談論使用代理服務器,那麼是的,這是完全正確的。 SOP是由瀏覽器執行的,因此PHP,ASP,ColdFusion等不受它的約束。您的JS向代理髮出請求,代理向服務發出請求,然後代理將結果返回給JS。 – GlenCrawford 2010-04-23 10:07:25

+0

我應該指出,使用代理可能會稍微增加流量和等待時間,因爲您現在提出兩個請求而不是一個請求。JS - >代理 - >服務 – GlenCrawford 2010-04-23 10:13:45

1

你可能想看看JSONP (JSON with Padding)。簡而言之,它涉及到添加一個腳本元素到網頁服務網址作爲src。然後,Web服務將JSON作爲第一個參數封裝在回調函數中,該函數在解析腳本時執行。

腳本元素是從Same Origin Policy豁免,這是他們如何能夠解決這個問題..

+0

會添加一個CrossDomain.XML有什麼用處?還是不是那麼簡單? – ChrisCa 2010-04-23 09:54:13

+2

@Christo Fur:如果XML文件允許Flash應用程序駐留的域,則向web服務所在域添加crossdomain.xml文件將使Flash應用程序能夠向API發出跨站點請求(更多信息:http://jimbojw.com/wiki/index.php?title=Cross-domain_Ajax_via_Flash) – GlenCrawford 2010-04-23 09:56:40

+0

@Christo Fur:+ RoseOfJericho說了些什麼。您可以查看'Access-Control'標題,但它們並未得到瀏覽器的廣泛支持(可能只是Fx),IE8要求您使用'XDomainRequest()'而不是'XMLHttpRequest()'。 JSONP是X瀏覽器兼容性的最佳選擇。 – 2010-04-23 10:06:21

0

通常情況下,你將不能;現代瀏覽器對此進行了限制,以防止跨站腳本攻擊。解決這個問題的方法之一可能是使用「填充」JSON,JSONP,它將結果插入到頁面上的腳本元素中。有一個Microsoft WCF sample here似乎這樣做。

0

我在兩天內遇到了同樣的問題,並且找到了解決方案,並且Google搜索後很優雅。 我需要一些小部件客戶端的xss Ajax,這些小部件客戶端將數據流從層級網站提取到我的Rails應用程序。 here's how I did.

+0

這只是解決你的問題的JSONP。您不必將其包裝在DOM對象中。 – 2013-08-23 12:26:00