2011-05-03 132 views
5

也许你们中的一些人可以帮助我更好地理解JavaScript同源策略。同源策略

同源策略被定义为以下的(http://en.wikipedia.org/wiki/Same_origin_policy):

在计算中,同源策略是许多浏览器端的编程语言,如JavaScript的一个重要的安全概念。该策略允许在源自同一站点的页面上运行的脚本访问彼此的方法和属性,而不受特定的限制,但是阻止访问不同站点上的页面上的大多数方法和属性。

我已经部署GWT应用程序的谷歌应用程序引擎与网址

http://metalsandstocks.appspot.com

由于GWT编译所有的Java到JavaScript,这意味着我的应用程序部署,如JavaScript。由于这是一个Ajax应用程序,我认为它需要遵守相同的原产地政策。该应用使用ajax拨打电话到不同的域名(http://finance.yahoo.com),以获得实时股票报价给用户。该应用程序按照描述的方式工作,但它具有与它要求更新的域不同的域。这个应用程序是否违反相同的原产地政策?为什么或者为什么不?

回答

5

您可以使用JSONP获得Yahoo Finance,这绝对是您正在使用的。

一个例子网址是...

http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=Apple&callback=YAHOO.Finance.SymbolSuggest.ssCallback 

当请求加载时,它会叫你在GET PARAM定义回调。这允许您解决相同的来源策略,前提是该服务支持JSONP。

或者,有些人使用他们的服务器作为代理。

4

CORS(跨源资源共享)是允许跨域AJAX调用的标准方法。

这很简单。例如,如果将HTTP标头Access-Control-Allow-Origin: *添加到页面(例如使用PHP),则来自任何域的JavaScript都将能够使用AJAX读取该页面。如果这样的头文件不存在,那么同源策略将阻止页面被来自不同域的AJAX调用读取。

使用CORS,页面的所有者(例如公开特定数据或API的页面)可以公开该页面(仅限那个页面),让其他人从他们自己的域中调用。原则是,如果一个页面的所有者明确地说“其他人可以访问我的东西”,那么CORS将允许它。否则,假定同一地点的政策。

参见:http://www.w3.org/TR/cors/

4

服务之间的访问数据,是不一样的调用一个域中定义JavaScript函数,从另一个域。 enter image description here

换句话说,我想你混淆“同源策略”(防止,例如,在从调用浏览器的另一个选项卡上的站点定义的JS函数浏览器一个标签)与JS从URL获取数据(例如,来自雅虎的股票价格)。

+0

现代浏览器可防止跨源AJAX调用。参见:http://www.w3.org/TR/cors/ – 2011-05-03 14:36:48

0

以下是您需要做的:JSONP。

由于上述政策,您无法向雅虎发送AJAX请求,但有解决方法。即脚本标签,它可以向任何地方发出请求。

例如,假设您想在用户点击“GO”按钮时向yahoo发送请求。您需要添加事件处理函数来捕获用户的单击事件,然后向DOM的头部添加新的脚本标记。脚本代码的网址是很重要的,它必须有一个回调PARAM在里面,例如:

http://helloasdf.cloudfoundry.com/get.tokens?callback=xss

注意回调可以是任意函数名。回应将是:

xss(["asdf"]) 

这意味着您的代码中的xss函数将被传递[“asdf”]。

或w /雅虎的API;

http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=GS&callback=YAHOO.Finance.SymbolSuggest.ssCallback

通知回调= YAHOO.Finance.SymbolSuggest.ssCallback它会调用该函数时,请求返回:

YAHOO.Finance.SymbolSuggest.ssCallback({"ResultSet":{"Query":"gs","Result":[{"symbol":"GS","name": "The Goldman Sachs Group, Inc.","exch": "NYQ","type": "S","exchDisp":"NYSE","typeDisp":"Equity"},{"symbol":"^GSPC","name": "S&P 500 INDEX,RTH","exch": "SNP","type": "I","typeDisp":"Index"},{"symbol":"GSS","name": "Golden Star Resources, Ltd.","exch": "ASE","type": "S","exchDisp":"AMEX","typeDisp":"Equity"},{"symbol":"^GSPTSE","name": "S&P/TSX Composite index (Interi","exch": "TOR","type": "I","exchDisp":"Toronto","typeDisp":"Index"},{"symbol":"GSK","name": "GlaxoSmithKline plc","exch": "NYQ","type": "S","exchDisp":"NYSE","typeDisp":"Equity"},{"symbol":"GSX","name": "Gasco Energy Inc.","exch": "ASE","type": "S","exchDisp":"AMEX","typeDisp":"Equity"},{"symbol":"OIL","name": "iPath S&P GSCI Crude Oil TR Index ETN","exch": "PCX","type": "E","typeDisp":"ETF"},{"symbol":"GSIC","name": "GSI Commerce Inc.","exch": "NMS","type": "S","exchDisp":"NASDAQ","typeDisp":"Equity"},{"symbol":"GST","name": "Gastar Exploration, Ltd.","exch": "ASE","type": "S","exchDisp":"AMEX","typeDisp":"Equity"},{"symbol":"GSI","name": "General Steel Holdings, Inc.","exch": "NYQ","type": "S","exchDisp":"NYSE","typeDisp":"Equity"}]}}) 

以下是你需要动态地添加了JS的例子脚本标签:

var headLoc = document.getElementsByTagName("head").item(0); 
var scriptObj = document.createElement("script"); 
var token="localstring" 
var url="http://helloasdf.cloudfoundry.com/get.tokens?callback=xssCallback"; 
    // Add script object attributes 
    scriptObj.setAttribute("type", "text/javascript"); 
    scriptObj.setAttribute("charset", "utf-8"); 
    scriptObj.setAttribute("src", url); 
    scriptObj.setAttribute("id", 'asf12'); 

    headLoc.appendChild(scriptObj); 

我更这里记录的过程:http://eggie5.com/22-circumvent-same-origin-policy