论坛首页 Web前端技术论坛

javascript的跨域请求

浏览 20343 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (12)
作者 正文
   发表时间:2011-01-07  
我以前是用JSON格式的
0 请登录后投票
   发表时间:2011-01-07  
楼主讲故事可以,技术一般吧,呵呵
0 请登录后投票
   发表时间:2011-01-07   最后修改:2011-01-07
yvfish 写道
楼主讲故事可以,技术一般吧,呵呵

哈哈,我可是会骄傲的。我一直以为自己是在小学生水平上。

下面的思路是:
介绍一下动态创建script。
把Ext、Jquery,YUI的的源代码贴出来看看。
介绍下其他几种跨域访问方式,这里怕说多了收不住,弄得喧宾夺主,本末倒置就不好了。

关于内容安排上,大家多提宝贵建议啊。
0 请登录后投票
   发表时间:2011-01-07  
我没明白 怎么就跨域了。。。
0 请登录后投票
   发表时间:2011-01-08  
ak121077313 写道
我没明白 怎么就跨域了。。。

原来的例子举的不好,现在做了下修改。
0 请登录后投票
   发表时间:2011-01-08  
william_ai 写道
话说上个世纪60年代初,在美国加州的森尼维尔市,伴着他的第一声哭声,Brendan Eich开始了他的一生。和普通的孩子一样,他度过了快乐的童年,懵懂的青年时代,也顺利的读完了学士和硕士学位,开始了他程序员的生活。

毕业以后他在Silicon Graphics玩了7年的操作系统和网络编程(难道一个人公司的感情也会有7年之痒)。

离开了他的老东家之后,他来到了MicroUnity Systems Engineering,玩起了microkernel和DSP编程,也是在这时他第一次接触了MIPS架构的gcc R4000端口。

他在Netscape和Mozilla的时候达到了事业上巅峰。1995年4月,他开始玩起了Mocha,经过他一段时间的努力Mocha变得很强大了,于是在同年的9月,一个华丽的变身,更名为livescript并且第一次被装在Netscape Navigator 2.0里。在同年的12月4日,在与Sun公司的的联合声明中,livescript变身到最终形态,JavaScript神兵横空出世。

由于JavaScript神兵太过强大,人们给他加了封印。可是人总是有私心的,于是又留下了一些打开封印的办法。

淡扯完了,下面介绍下封印和如何解开封印。

先说下封印跨域访问,javascript同源策略的限制,即a.com域名下的js无法操作b.com域名下的对象(跨域)。下面举了几个例子,看起来更形象一些。
URL 1URL 2是否允许通信备注
http://www.a.com/a.jshttp://www.a.com/b.js同域名
http://www.a.com/a.jshttp://www.a.com:8080/b.js同域名不同端口
http://www.a.com/a.jshttps://www.a.com/b.js同域名不同协议
http://www.a.com/a.jshttp://127.0.0.1/b.js域名与其IP
http://www.a.com/a.jshttp://www.b.com/b.js主域名子域名
http://www.a.com/a.jshttp://www.b.com/b.js不同域名

下面说下解开跨域访问这个封印的几个主要手印。

手印一JSONP,即JSON with Padding。由于封印同源策略的限制,跨域访问被封印了起来。如果需要解开封印进行跨域请求,得使用html的script标记,进行跨域请求,在response中,返回要执行的javascript代码、JSON对象等。这种解开封印进行跨域请求的方式称为JSONP。

如在www.a.com域名下有如下的html文件:
<html>
<head>
</head>
<body>
<script type="text/javascript" id="script1"></script>
<input type="text" id="a" name="a">
<input type="button" value="click" onclick="document.getElementById('script1').src='http://www.b.com/response.js'">
</body>
</html>

在www.b.com下的响应的response.js代码
var a=1;//设置变量
alert("Hello World");//调用函数
document.getElementById("a").value="Hello World";//设置表单

大多数时候,为了动态,我们是这么玩的。把www.a.com下的htm改成
<html>
<head>
</head>
<body>
<script type="text/javascript" id="script1"></script>
<input type="text" id="a" name="a">
<input type="button" value="click" onclick="document.getElementById('script1').src='http://www.b.com/response.jsp'">
</body>
</html>

把www.b.com/response.js改成response.jsp
<%out.print("var a=1;alert(\"Hello World\");document.getElementById(\"a\").value=\"Hello World\"");%>

虽然URL上看只多了一个p,但是手印JSONP却在解开封印的同时变得更具破坏力。

在手印JSONP的基础上,仙人YUI、Jquery、Dojo、Ext等纷纷研究出了自己的手印。

首先我们看看仙人YUI做了哪些工作。
YUI3.2的jsonp的使用方法如下(下面都是围绕YUI3.2分析的):
var url = "http://yuilibrary.com/gallery/api/random?callback={callback}";
function handleJSONP(response){//...};
//...
Y.jsonp(url,handleJSONP);
//...

ps:源码中examples/jsonp/jsonp_gallery.html有详细内容。
结印很快,调用很方便,下面看看是怎么实现的。
下载http://developer.yahoo.com/yui/3/,选择Full Developer Kit版,将yui_3.2.0.zip解压后,在yui/buil/jsonp目录下会看到6个文件:
jsonp.jsjsonp-debug.jsjsonp-min.js
jsonp-url.jsjsonp-url-debug.jsjsonp-url-min.js

主要看下jonp.js这个文件,在第8行
YUI.add('jsonp', function(Y) {
//...

为YUI这个function动态添加了一个叫jsonp的function。后面的代码中用到了大家耳熟能详的prototype,apply和unshift等JavaScript神兵的秘法,就不一一分析了,直接看第133行到137行之间的代码。
//...
        Y.Get.script(url, {
            onFailure: wrap(config.on.failure),
            onTimeout: wrap(config.on.timeout),
            timeout  : config.timeout
        });
//...

这里有个Y.Get.script(...)的调用,有url,onFailure,onTimeout和timeout参数,这个到底是做什么的呢?

to be continued......

0 请登录后投票
   发表时间:2011-01-09  
看了两天的tzb,明天更新,哈哈
0 请登录后投票
   发表时间:2011-01-10  
快点更新阿。。。
0 请登录后投票
   发表时间:2011-01-10   最后修改:2011-01-10
谢谢两位投良好的朋友支持我的帖子,同时也谢谢11位投隐藏的朋友百忙之中读了我的帖子,可是,能说下为什么隐藏么,有哪里写的不好或是不对地方?虚心求教,更好的把这个故事讲完。更希望读到这篇贴子的每位朋友也多提意见。
0 请登录后投票
   发表时间:2011-01-10  
字很多,经常处理跨域问题,还没有一个很好的解决方案,收藏一下先
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics