Javascript 高级 --同源策略

同源策略是一种安全机制。它能为我们降低我们本地文件的风险。首先是同源的概念。在互联网上,我们打开网页肯定来不同的服务器,我们可以正常加载这些页面。但是,我们不能修改,或者是访问不同的服务器的页面。(在不跨域的技术下)。只有符合同源的才能相互访问,符合同源的条件是有三个要素的:

1:安全协议需要相同,就是http/https

2:域名相同:

3:端口号相同。

只有是这三个要素相同时,我们称为同源。不然,就是不是同源,就需要启动同源策略。什么是同源策略呢?

1:本地的Cookie、localStorage,IndexDB的存储的文件不能访问。Cookie,localStorage indexDB 的存储文件。indexDB

2:DOM的操作是无法进行的。DOM的操作肯定需要访问本地磁盘文件。同源策略就是保护本地的磁盘文件,防止信息泄露。当然也是无法进行的。

3:AJAX的访问是不能进行发送请求。ajax的访问也是无法进行的,ajax请求也是来访问另一个服务器的文件。也是访问不到的。所以,同源策略是为保护信息文件的。所以,三种情况.1:cooKie localStorage indexDB。2:ajax访问是不能访问的。 3:DOM操作是无法操作的。但是,我们可以通过浏览器来访问不同的页面。但是,不能操作其中的文件。这是同源策略的含义。

这给我们带来些安全机制,但是我们也需要进行跨域请求。发送AJAX请求,来进行页面的操作,所以,我们可以通过一些技巧来进行跨域,来打破同源策略。这就是 JSONP技术。

我们技术员在开发的时候,我们发现有个属性 src 可以跨域请求的任意文件。我们知道<script></script>有src的属性,正好我们可以利用script 的src属性进行操作。所以,我们的jsonp的技术就是利用script标签的src的属性。所以,我们的第一步就是创建script标签。

var scriptTag = document.createElement("script");

 // 添加相关的属性

scriptTag.tyle="text/javascript";

scriptTag.src = "具体的接口路径+?callback=回调函数名"

// 在接口路径的位置上加上参数,用callback的属性=回调函数名的话,这一步是个关键。我们的jsonp的技术关键点就是用src的属性去跨域来去访问接口,后台会把数据(一般格式是json文件)打包成函数的执行代码来返回。其中数据的位置是放在函数的参数里。我们就可以利用这一点来进行操作。我们就创建一个函数。函数名就是整个函数存放的空间地址,也就是整个函数体,然后我们把函数名放到接口后的参数,来调用执行。然后 函数的形式参数就是数据的存放的地方。我们就可以在函数内部执行来接受参数就可以接受到了后台的传过来的数据了。是json文件,我们可以再通过解析数据,来进行拼接到页面中。我们还要把script标签拼接到文档流中。等页面加载完后再加载。

window.onload = function () { 

document.head.appendChild(scriptTag);

}

function doem(data){     // callback =doem。

           console.log(data);

}

主要是回调函数的作用机制。我们要理解其中的工作原理。回调函数的运作原理就是把函数本身当做发送方法的参数,当然写在接口后的,用问号?来拼接。然后等后台来发送执行函数代码时,open方法或者是callback方法就可以来触发这个函数名的函数了。我们在回调函数用参数来接受了后台发送的数据。

我们在封装ajax时,我们也需要用到回调函数的运行原理。因为在ajax请求中,请求是异步请求方式,是在服务器响应时,页面也在继续执行。所以我们也要及时拿到数据,就利用回调函数。创建一个函数,函数名当成参数,在封装ajax中,我们再加个函数名作为参数,来触发调用函数,我们来看看这个封装ajax方法。

// 自己封装ajax。

// 我们考虑参数列表。method,url,data,callback.

       function ajax(method,urls,data,callback) {

//创建请求对象

            var xhr = window.XMLHttpRequest ? new XMLHttpRequest() :new         ActiveXObject("Microsoft.XMLHTTP");

//判断请求方式

          method = method.toUpperCase(); // 转化为大小写。

          if(method == "GET") {

                   xhr.open("GET",urls+"?"+data,true);

                   xhr.send(null);

         }else if  (method =="POST") {

             xhr.open("POST",urls,true)

              xhr.send(data)

        }else{

            alert("请输入合法的请求方式")

      }

        //添加事件监听

      xhr.onreadystatechange  =  function  ()  {

             if(xhr.readyState ==4 && xhr.status ==200){

            // 判断服务器回传的数据类型。

                     if(!xhr.responseXML){

                       callback(xhr.responseText)

                     }else{

                       callback(xhr.responseXML)

           }

       }

    }

}

 所以,我们来总结一下,jsonp技术的本质。

1:就是利用src的属性,可以无限制的加载服务器接口的内容特性,也就是说,有get的请求。所以,我们在含有src的属性标签(script)可以实现跨域。它请求服务器的接口位置加载到src的路径中,并凭借一个callback=回调函数名来作为接口位置的参数。所以,我们要记得,在用jsonp技术方法和src属性时,我们要记得,要用callback=回调函数名的形式,然后,我们创建回调函数,传参,在函数内部来解析参数就可以了,我们就可以拿到服务器给我们的数据了。

2:而在服务器端,收到了该请求,会取出函数名,并拼接成函数执行的代码形式,然后把前端的所需要的数据打包在回调函数的参数里,一块返回给前端。

3:而前端收到服务器回调的执行代码后,开始触发回调函数,让浏览器来解析运作。我们就可以在回调函数的参数中进行解析数据,再拼接到页面中。在拼接到页面中,我们用的是DOM节点来操作,创建的标签,赋值,再添加到页面中。就可以在页面中显示出来了。当然,我们还有其他方法来进行解析服务器给我们发的数据的,特别是复杂的数据,我们可以用封装好的模板来解析,我们将在下一章来进行理解模板。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,170评论 0 7
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,162评论 0 1
  • Ajax和XMLHttpRequest 我们通常将Ajax等同于XMLHttpRequest,但细究起来它们两个是...
    changxiaonan阅读 2,221评论 0 2
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,321评论 0 2
  • 一年又进尾声 浑浊的空气 熙攘的人群 错乱复杂的心情 结合这一天的感情 无奈又说错了话 悲伤的又沉下头 你们说我总...
    皆非_lx阅读 257评论 2 5