Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 564|回复: 0

PHP下ajax跨域的解决方案之jsonp

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-4 18:15:47 | 显示全部楼层 |阅读模式
    首先要说明一下json和jsonp的区别?
    json是一种基于文本的数据交换方式,或者叫做 描述 数据的一种格式。
    var person = {
    	"name": "test",
    	"age": "25",
    	"sex": "男"
    };
    
    var data = [1, 2, 3, 4, 5];
    
    而jsonp是一种非官方跨域数据交互协议,该协议允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住json数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

    比如我在a.com的网站上引用了b.com的一个b.js,但这样跨域的引用并不会产生错误,说明调用js文件时不受跨域的影响。
    <script type="text/javascript" src="http://www.b.com/b.js"></script>
    
    那么我们在b.js里添加如下代码,看看是否能够执行
    alert("I from b");
    
    确定是可以执行。
     
    那么如果我们在a.com上自已创建一个js函数,而在b.com下的b.js中调用,那是否可行呢?
    a.com下的index.html如下:
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<title></title>
    </head>
    <body>
    	<script type="text/javascript">
    		function a(data) {
    			alert("I from a \r\n" + "data:" + data);
    		}
    	</script>
    	<script type="text/javascript" src="http://www.b.com/b.js"></script>
    </body>
    </html>
    
    b.com下的b.js如下:
    a("from b");
    
    上面也是可以执行的,我们可以看到在b.js中的数据确实正确的传到了函数a中。
     
    问题又来了,a.com中创建的函数名与b.js中调用的函数名必须一致,那么如何才能让b.com服务端知道这个函数名,只有通过地址栏来传递了,加上一个callback=函数名来传递。当然callback这个命名可以改,但大家都这么命名,也就约定俗成了。
    a.com下的index.html如下:
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<title></title>
    </head>
    <body>
    	<script type="text/javascript">
    		function a(data) {
    			alert("uid :" + data.uid + "name :" + data.name);
    		}
    	</script>
    
    	<!-- 注意这里把b.js改成b.php了 -->
    	<script type="text/javascript" src="http://www.b.com/b.php?callback=a"></script>
    </body>
    </html>
    
    b.com下的b.php如下:
    <?php
    
    $callback = !empty($_GET['callback']) ? trim($_GET['callback']) : '';
    
    if(!empty($callback)) {
        $data = json_encode(array(
            'uid' => 1,
            'name' => '测试',
        ));
        
        echo "{$callback}({$data});";
    }
    

    上面也是可以执行的,知道了回调函数名,b.com服务端处理好数据,然后通过字符串拼接输出。

     
    jquery中就已经提供了jsonp的支持,a.com下的index.html如下所示:
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<title></title>
    </head>
    <body>
    	<div class="info"></div>
    	<script type="text/javascript" src="http://www.b.com/jquery.js"></script>
    	<script type="text/javascript">
    	$.ajax({
    		dataType: "jsonp",
    		url: "http://www.b.com/b.php",
    		jsonp: "callback",
    		success: function(data) {
    			$(".info").text("uid:" + data.uid + " name:" + data.name);
    		}		
    	});
    	</script>
    </body>
    </html>
    
    PHP下ajax跨域的解决方案之jsonp - 怀素真 - 因上努力 果上随缘
    跨域策略限制情况表如下:
    URL 说明 允许通信
    http://www.a.com/a.js
    http://www.a.com/b.js
    同一域名下 允许
    http://www.a.com/lab/a.js
    http://www.a.com/script/b.js
    同一域名下不同文件夹 允许
    http://www.a.com:8000/a.js
    http://www.a.com/b.js
    同一域名,不同端口 不允许
    http://www.a.com/a.js
    https://www.a.com/b.js
    同一域名,不同协议 不允许
    http://www.a.com/a.js
    http://127.0.0.100/b.js
    域名和域名对应ip 不允许
    http://www.a.com/a.js
    http://script.a.com/b.js
    主域相同,子域不同 不允许
    http://www.a.com/a.js
    http://a.com/b.js
    同一域名,不同二级域名(同上) 不允许
    http://www.a.com/a.js
    http://www.b.com/b.js
    不同域名 不允许

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-15 17:01 , Processed in 0.066768 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表