加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

跨域通信

发布时间:2020-12-16 19:23:59 所属栏目:百科 来源:网络整理
导读:今天一早在逛博客园的时候,突然看到一篇关于跨域请求HTTP的文章,进去看了一下,又翻了以前自己遇到的类似的问题,查了一些资料,看了一整个上午,虽然没完完全全的弄懂,但还是小有收获,接下来会继续深入探究。 跨域通信而不受同源策略,其实大家对同源策

今天一早在逛博客园的时候,突然看到一篇关于跨域请求HTTP的文章,进去看了一下,又翻了以前自己遇到的类似的问题,查了一些资料,看了一整个上午,虽然没完完全全的弄懂,但还是小有收获,接下来会继续深入探究。

跨域通信而不受同源策略,其实大家对同源策略应该都很了解的,为了安全起见这也是必须存在的,但当我们需要引入外部资源的时候,这便成为了很大的一道阻碍,不过终究还是办法解决的,好像大家普遍地推崇JSONP的方法,简单而且不受任何限制,在看了几种方法之后,个人也觉得JSONP是最容易理解的一种方法。

首先先简单地用文字介绍一下Ajax,Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用XMLHttpRequest函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。

使用基于<script>的Ajax传输协议时,服务器响应采用JSON编码的数据格式,当执行脚本时候,JavaScript解析器能够自动将其解码. 由于它使用JSON数据格式,因此这种Ajax传输协议也叫做"JSONP". 所以使用jsonp技术,只需要设置<script>的src属性,并且插入到document中,然后浏览器就会发送一个http请求以下载src属性所执行的url

其实就是在web页面动态插入脚本元素,其实自己不是做web出身的,所以有些东西也只是半懂半不懂的,最近在弄一个win8应用,是用HTML5和WinJS做的,所以,一些基本的web的东西还是看得懂的,只是在运用方面有些困难。

好了,回归正题,说到跨域,之前有在弄Nokia地图的东西,想着如何将Nokia地图导入到win8应用里面,把api里给的HTML代码复制进去以后发现,跨域了,没法下载外部资源,Nokia地图官方又没有win8的SDK,想着是没什么可能导进去的吧,又过了几天,在win8应用商店上发现了一个神级地图应用,什么地图都有,个人觉得厉害的是它连Open Street Map都有,而且也有Nokia,才知道原来自己真的是菜鸟。今早又重新试了一下,哦,忘了贴一下一位大牛的代码,关于JSONP的

//根据指定的url发送一个json请求
//然后把解析得到的响应数据传递给回调函数
//在url中添加一个名为jsonp的查询参数,用于指定该请求的回调函数的名称
function getJSONP(url,callback){
    //为本次请求创建一个唯一的回调函数名称
    var cbnum = "cb"+getJSONP.counter++;
    var cbname = "getJSONP."+cbnum;    //作为jsonp函数的属性

    //将回调函数名称以表单编码的形式添加到url查询部分中
    if(url.indexOf("?") === -1){
        url += "?jsonp="+cbname;  
    }else{
        url += "&jsonp="+cbname;
    }

    //创建<script>用于发送请求
    var script = document.createElement("script");
    //定义被脚本执行的回调函数
    getJSONP[cbnum] = function(response){
        try{
            callback(response);    //处理响应
        }
        finally{
            //删除该函数,并移除相应script元素
            delete getJSONP[cbnum];
            script.parentNode.removeChild(script);
        }
    }
    //立即触发http请求
    script.src = url;
    document.body.appendChild(script);
}
getJSONP.counter = 0;
自己修改了一下之后,将原本要调用外部资源的URL放到里面,发现可以了,跨域问题解决了,但又出现了另一个问题,这是自己以后要继续探究的东西

所以,还是失败了,但是,又给我发现了另一个新东西,原来Nokia maps api中的mobile HTML5 api是可以用在win8上的,哎,看了这么久才知道,都怪自己以前不细心,老吊死在一棵树上,这样一来,自己的Nokia maps在win8上的应用又可以继续下去了,总的来说,还是有很大收获的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读