如何实现js跨域调用

来源:互联网 发布:鼓机效果器软件 编辑:程序博客网 时间:2024/06/05 14:18

最近需要提供一个接口给外部门使用,没遇到过降域的问题。比较通用的方法,可以使用jsonp方式进行调用。下面有一篇文章讲得不错,把原理讲得很清晰,基本原理:就是利用js的src标签,src可以越过同源策略的限制,巧妙实现跨域访问。

http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.html


另外:这里要指出的一点就是,使用jsonp方式,无法使用post方式提交表单,根本原因就是因为他是通过script方式去加载的。


=================================================================================================

给其他部门写了个cgi,早上把服务端进行了下改造,想使用jsonp方式进行跨域,结果发现jasonp方式无法使用post方式访问,又花了两个小时,改造成了使用iframe + document降域的方式进行访问。

具体方案如下:

欲提供给外部调用的cgi地址为:http://aa.bb.com/hello,外的域名为http://cc.bb.com/nimei.html

可以通过在同域下面,新建一个页面,作为代理页面,通过代理页面来绕过跨域。

1、新建一个页面:http://aa.bb.com/agent.html

在该页面下:

<html>

<body>

<script>

document.domain="bb.com" //这里把域降成bb.com

function callback()

{

/*这里可以随心所欲调用aa.bb.com下的cgi了

这里特别注意:前提必须相对的协议,该页面是http的,你不能去调用https协议的cgi,否则访问不了

*/

}

</script>

</body>

</html>

2、外部调用,使用iframe的src属性,去加载1中的代理页面,通过这个属性来绕过js同源访问策略。

http://cc.bb.com/nimei.html中,添加如下html代码片段:

<html>

<head>

</head>

<script>

document.domain="bb.com";  //这里把域降到基础域

 function callChild()

 {

myFrame.window.callback();                 //这里便可以调用代理页面提供的接口函数了,实现跨域调用

 }

</script>

<iframe name="myFrame" src="http://aa.bb.com/agent.html" style="display:none"></iframe>

</html>


总结:实施过程当时,因为把协议没对上,所以总是跨域访问不成功。之前看过不少理论上的东西,但做起来,又是另一种滋味。

还是那句老话:纸上得来终觉浅 绝知此事要躬行!!!