简单的整理了jsonp跨域的发展

1.何为跨域?

妹纸我问了度娘   跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。

妹纸觉得度娘说的对,但是也整理了自己对跨域的理解,跨域实际是浏览器的安全机制也就是同源策略作用下产生的,和服务器没有关系,

但是解决跨域问题必须是服务器允许才可以的,浏览器是不能控制跨域的

2.什么是同源策略?
同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,

如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

妹纸我盗了以个小哥哥的图看一下同源的意思

3.如何解决跨域问题呢?

很多种方法  比如 

document.domain+iframe ,window.name+iframe, 图片ping或script标签跨域 ,还有jsonp

妹纸我呢,就讲讲jsonp跨域的演化过程和原理吧

a.  首先 js的 script标签的src属性 是可以  请求跨域的文件内容, 将来会将内容, 当成js执行

html里面 <script src="http://www.xxx.com/jsonp.php"></script>
php 里面 <?php

  echo "alert('我是这里的数据’)";

?>
 
  

b.  在使用数据之前必须先引入数据,那么我们的需求是点击按钮才需要加载数据怎么办呢?当然是需要我们自己动态创建script标签啦, 想啥呢哈哈

<?php

  echo "var a = '我是你要的数据';";

?>

 


<button>获取数据</button> <script> var button = document.querySelector("button"); button.onclick = function() { // 动态创建script标签, 动态创建script标签加载内容是需要时间的 var script = document.createElement("script"); script.src = "http://www.xxx.com/jsonp.php"; document.body.appendChild( script );
    console.log( a );//这个a是php里面定义的数据变量
 

c.   但是当我们需要遇到数据请求的很慢的时候,js主线程已经走完了,数据还没过来 那么 这个数据在控制台打印是没定义的会报错 

没办法实时的获取数据, 满足不了点击按钮, 获取数据的需求
 
d.那就创建以个函数吧,然后把数据当做实参返回给我们
    // 定义了一个全局函数
    function func( data ) {
      console.log( data );
    }

    button.onclick = function() {
      // 动态创建script标签, 动态创建script标签加载内容是需要时间的
      var script = document.createElement("script");
      script.src = "http://www.xxx.com/jsonp.php";
      document.body.appendChild( script );
      // 请求结束, 得到结果 'php数据'; script 会将结果当成 js 执行
    }

 

<?php

  echo "fn('php数据')";

?>

但是呢。这个函数是死的,每次都需要定死,后台小哥哥可是很不高兴的,怎么办,

那就传一个函数过去,让后台获取,再返还回来,一般传过去的名字都会叫做callback

  // 定义了一个全局函数  
    function fn( data ) {
      console.log( data );
    }

    button.onclick = function() {
      // 动态创建script标签, 动态创建script标签加载内容是需要时间的
      var script = document.createElement("script");
      // 业内规范: 传递函数名时, 键必须叫 callback
      script.src = "http://www.xxx.com/jsonp.php?callback=fn";
      document.body.appendChild( script );
    }
<?php

  header('content-type:text/html;charset=utf-8');
  
  // 接收到前端传递过来的函数名
  $callback = $_GET['callback'];  // fn

  echo "$callback('复杂数据')";  // fndata('复杂数据')

?>

总结一下原理吧

初步演化:

1. 利用 script 标签 src 可以跨域的特性, 实现跨域请求数据

2. 就可以动态创建 script 标签, 利用src 请求 服务器端 js 内容的字符串回来

3. 将来在浏览器就可以解析执行 js 内容

 

后来jsonp:

前端:

1. 定义一个全局函数, 接收后台传递的数据

2. 在通过 script src 请求后台的同时, 拼接上 callback=函数名

 

后台:

1. 获取到通过 callback 传递过来的函数名

2. 返回函数调用(字符串), 在函数调用中, 以实参的方式将数据返回

 

最后妹纸我来说说jquery中的jsonp吧

 $('button').click(function() {
      // jsonp 和 ajax 没有关系的
      // jquery 将 jsonp 封装到 ajax 方法中,
      $.ajax({
        type: "post",
        url: "http://www.xxx.com/jsonp.php",
        // 指定 dataType 为 jsonp, 告诉 jquery, 我们要发送 jsonp 跨域请求
        dataType: "jsonp",
        // jsonp: "callback",
        success: function( data) {
          console.log( data);
        }
      })
    })  

原理实际一样,当你把后台数据sleep(10)睡10秒钟的时候,你会发现 jquery让浏览器做了一件事

// http://www.xxx.com/jsonp.php ?callback=jQuery112208618546570402954_1528602949160 传递给后台的全局函数名
是不是一样呀,后面那一大串就是函数名
 
好吧妹纸总结结束了,就这样吧

 

 

 

 

转载于:https://www.cnblogs.com/wxc1991/p/9168202.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值