javascript跨域问题总结

来源:互联网 发布:唐山小白帽事件 知乎 编辑:程序博客网 时间:2024/05/18 01:05

1jsonp实现(<script>标签的动态创建)。由于同源策略,一般来说位于 server1.example.com 的网页与不是 server1.example.com 的服务器沟通,HTML 的 <script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析,另外这种办法只能传递js类型的数据,不是很方便。使用方法为:

   1、在客户端调用提供JSONP支持的URL Service获取JSONP格式数据。如 

<script type="text/javascript" src="http://www.yiwuku.com/myService.aspx?jsonp= onCustomerLoaded"></script>

  返回的数据类似于 onCustomerLoaded({result:”success”});

    2、在客户端callbackFunction函数的实现

  <script type="text/javascript">           function onCustomerLoaded(result, methodName) {    }  </script>

2document.domain+iframe的设置。对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。具体的做法是可以在http://www.kuqin.com/a.htmlhttp://script.kuqin.com/b.html两个文件中分别加上document.domain = kuqin.com;然后通过a.html文件中创建一个iframe,去控制iframecontentDocument,这样两个js文件之间就可以交互了。当然这种办法只能解决主域相同而二级域名不同的情况,如果你异想天开的把script.kuqin.comdomian设为alibaba.com那显然是会报错地!代码如下:
www.kuqin.com上的a.html

   

script.kuqin.com上的b.html

但是如果请求的服务器不是你的那该怎么办呢?比如土豆视频分享功能,利用ajax无法获取数据,应该是浏览器处于安全考虑,我的做法是在服务器端直接调用api的接口获取数据:

/** * 获取土豆视频 * 如果视频不存在返回:{"multiResult":{"results":[]}}   * 参考API:http://api.tudou.com/apidoc/index.php/%E8%BD%AC%E8%B4%B4%E4%BF%A1%E6%81%AF%E6%9F%A5%E8%AF%A2 */public static WeiboVideo getTudouVideo(String url) throws Exception {String input = url ;String output = "http://api.tudou.com/v3/gw?method=repaste.info.get&appKey=f70c38b3b2a680a8&format=json&url="+input;String str = SimpleHttpClient.simpleRequest(output, "",null,"utf-8");    System.out.println("WeiboVideoUtil.getTudouVideo()"+str);JSONObject json = new JSONObject(str);      JSONObject multiResult = json.getJSONObject("repasteInfo");      JSONObject res = multiResult.getJSONObject("itemInfo");           WeiboVideo wv= new WeiboVideo();      wv.setTitle(res.getString("title"));      wv.setThumbnail(res.getString("picUrl"));      wv.setSummary(res.getString("description"));      wv.setTime(res.getString("totalTime"));      wv.setSource("土豆视频");      wv.setPageUrl(res.getString("itemUrl"));      wv.setFlashUrl(res.getString("html5Url"));      String  htmlCode = "<embed src=\""+res.getString("outerPlayerUrl")+"\" allowFullScreen=" +      "\"true\" quality=\"high\" width=\"480\" height=\"400\" align=\"middle\" allowScriptAccess=\"always\" type=\"application/x-shockwave-flash\"></embed>";      wv.setHtmlCode(htmlCode);      return wv;}