JavaScript跨域问题的解决方案

发表于:2010-2-10 14:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  由于安全方面的考虑,Javascript被限制了跨域访问的能力,但是有时候我们希望能够做一些合理的跨域访问的事情,那么怎么办呢?

  这里分两类情况:

  一、基于同一父域的子域之间页面的访问;参见如下3个domain域:taobao.com、jipiao.taobao.com、promotion.taobao.com;它们有相同的父域taobao.com。

  二、基于不同父域页面之间的访问;参见如下3个domain域:taobao.com、baidu.com、sina.com.cn;它们具有不同的父域。

  解决它们之间跨域的方案有:

  方案1:服务器Proxy

  域 A的页面JS需要访问域B下的链接获取数据,该方案在域A的服务器端建立一个Proxy程序(可能是ASP、servlet等任何服务端程序),域A的页面JS直接调用本域下的Proxy程序,proxy程序负责将请求发送给域B下的链接并获取到数据,最后再通过Proxy将数据返回给页面JS使用。

  经过的访问流程就是: 域A下JS --> 域A 下Proxy -- > 域B下的链接

  例子:

  第一步:

  域A: http://Jipiao.taobao.com/test.htm

  页面上javascript脚本:

1. <mce:script type="text/javascript"><!-- 
2. Var sUrl="http://Jipiao.taobao.com/proxy.do"; //本域下代理地址 
3. var callback = 
4. { 
5.    success: function(res) {  alert(res.responseText);  },  
6.    failure: function(res) {  alert('failure');},  
7.    argument:{}  
8. } 
9. YAHOO.util.Connect.asyncRequest('GET', sUrl, callback, null);   
10. // --></mce:script> 

  第二步:

  完成域A服务端的Proxy程序(这里假定是一个servlet),伪码如下:

1. Public class Proxy extends …….{ 
2. ..doGet(……..){ 
3.  HttpClient  client=……; 
4.  GetMethod get=new  GetMethod("www.baidu.com/xxxxx.do");//访问域B的链接 
5.  int statusCode = client.executeMethod(get); 
6.  if (statusCode != HttpStatus.SC_OK) { 
7.      byte[] responseBody = get.getResponseBody(); 
8.      String res=new String(responseBody); 
9.      Httpresponse.getWriter().write(res);//将数据返回给域A   
10.  } 
11. } 
12.  
13. } 

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号