我試圖從一個jQuery客戶訪問Web服務 - 跨域
具體這個例子 http://www.codeproject.com/KB/aspnet/WCF_JQUERY_ASMX.aspx#4
一切運作良好時,客戶端的網頁是在同一個域中接取WCF服務服務
只要我將客戶端網頁移動到另一個域,它就會中斷。它不能達到的服務和請求失敗
出現這種情況的所有例子,ASMX,REST和WCF
任何想法如何得到這個工作交叉daomain?
我試圖從一個jQuery客戶訪問Web服務 - 跨域
具體這個例子 http://www.codeproject.com/KB/aspnet/WCF_JQUERY_ASMX.aspx#4
一切運作良好時,客戶端的網頁是在同一個域中接取WCF服務服務
只要我將客戶端網頁移動到另一個域,它就會中斷。它不能達到的服務和請求失敗
出現這種情況的所有例子,ASMX,REST和WCF
任何想法如何得到這個工作交叉daomain?
您正針對同源策略運行。您正在訪問的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);
}
你可能想看看JSONP (JSON with Padding)。簡而言之,它涉及到添加一個腳本元素到網頁服務網址作爲src。然後,Web服務將JSON作爲第一個參數封裝在回調函數中,該函數在解析腳本時執行。
腳本元素是從Same Origin Policy豁免,這是他們如何能夠解決這個問題..
會添加一個CrossDomain.XML有什麼用處?還是不是那麼簡單? – ChrisCa 2010-04-23 09:54:13
@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
@Christo Fur:+ RoseOfJericho說了些什麼。您可以查看'Access-Control'標題,但它們並未得到瀏覽器的廣泛支持(可能只是Fx),IE8要求您使用'XDomainRequest()'而不是'XMLHttpRequest()'。 JSONP是X瀏覽器兼容性的最佳選擇。 – 2010-04-23 10:06:21
通常情況下,你將不能;現代瀏覽器對此進行了限制,以防止跨站腳本攻擊。解決這個問題的方法之一可能是使用「填充」JSON,JSONP,它將結果插入到頁面上的腳本元素中。有一個Microsoft WCF sample here似乎這樣做。
我在兩天內遇到了同樣的問題,並且找到了解決方案,並且Google搜索後很優雅。 我需要一些小部件客戶端的xss Ajax,這些小部件客戶端將數據流從層級網站提取到我的Rails應用程序。 here's how I did.
這只是解決你的問題的JSONP。您不必將其包裝在DOM對象中。 – 2013-08-23 12:26:00
那麼你是否會對同一個域上的服務進行ajax調用,並將請求轉發給預期的服務?但是,從服務器端代碼那裏沒有瀏覽器強加的限制嗎? – ChrisCa 2010-04-23 10:04:51
如果你正在談論使用代理服務器,那麼是的,這是完全正確的。 SOP是由瀏覽器執行的,因此PHP,ASP,ColdFusion等不受它的約束。您的JS向代理髮出請求,代理向服務發出請求,然後代理將結果返回給JS。 – GlenCrawford 2010-04-23 10:07:25
我應該指出,使用代理可能會稍微增加流量和等待時間,因爲您現在提出兩個請求而不是一個請求。JS - >代理 - >服務 – GlenCrawford 2010-04-23 10:13:45