2010-04-23 158 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