跨域知识(二)——JSONP
JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。
它的基本思想是,网页通过添加一个<script>元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
如果对于callback参数如何使用还有些模糊的话,我们后面会有具体的实例来讲解。
首先,网页动态插入<script>元素,由它向跨源网址发出请求。
<h1>绕过浏览器禁止跨域请求的方案之八——JSONP</h1>
<button id="bt1">请求数据</button>
<script src="jquery-1.11.3.js"></script>
<script>
//声明静态函数 —— 客户端不直接调用
function doRes(data){
console.log('开始处理服务器端返回的数据')
console.log(data);
} $('#bt1').click(function(){
//动态创建一个SCRIPT标签,添加到DOM
var s = document.createElement('script');
s.setAttribute('async', 'true'); //脚本异步执行
s.src = 'http://localhost/crossdomain/4.php?callback=doRes';
document.body.appendChild(s);
//OM树上追加了新的SCRIPT,浏览器就
//会立即请求该资源并执行服务器返回的JS })
上面代码通过动态添加<script>元素,向服务器http://localhost/crossdomain/4.php发出请求。
注意,该请求的查询字符串有一个callback参数,用来指定回调函数的名字,这对于JSONP是必需的。

2.基于jquery的跨域
jquery发起跨域请求,有两种方法:
(1)$.getJSON()
XHR非跨域请求:
$.getJSON('x.php', function(){})
SCRIPT实现JSONP请求
$.getJSON('跨域地址/x.php?callback=?', function(){})
(2)$.ajax()
XHR非跨域请求:
$.ajax({....})
SCRIPT实现JSONP请求:
$.ajax({
url: '跨域地址/x.php',
dataType:'jsonp',
success: function(){ ... }
})
demo1如下:
<h1>jQuery.getJSON与跨域请求</h1>
<button id="bt1">请求数据(非跨域)</button>
<button id="bt2">请求数据(跨域)</button>
<script src="jquery-1.11.3.js"></script>
<script>
$('#bt1').click(function(){
//XHR非跨域
$.getJSON('5-1.php', function(data){
console.log('1 处理服务器返回的数据')
console.log(data);
})
}); $('#bt2').click(function(){
//XHR跨域 —— 浏览器禁止
// $.getJSON('http://localhost/crossdomain/5-1.php?', function(data){
// console.log('2 处理服务器返回的数据')
// console.log(data);
// }) $.getJSON('http://localhost/crossdomain/5-2.php?callback=?',function(data){
console.log('3 处理服务器返回的数据')
console.log(data);
})
});
jquery在处理jsonp类型的ajax时(还是忍不住吐槽,虽然jquery也把jsonp归入了ajax,但其实它们真的不是一回事儿),自动帮
你生成回调函数并把数据取出来供success属性方法来调用。
在服务器端,代码如下:
<?php
//header('Content-Type: application/json');
header('Content-Type: application/javascript');
sleep(10); //让当前解释器暂停执行10s
$cb = $_REQUEST['callback'];
$data = [
'ename'=>'Tom',
'age'=>20
];
echo $cb. '(' .json_encode($data) . ')';
demo2如下:
<h1>jQuery.ajax与跨域请求</h1>
<button id="bt1">请求数据(非跨域)</button>
<button id="bt2">请求数据(跨域)</button>
<script src="jquery-1.11.3.js"></script>
<script>
$('#bt1').click(function(){
//XHR非跨域
$.ajax({
url: '6-1.php',
success: function(){}
})
}); $('#bt2').click(function(){
$.ajax({
url: 'http://localhost/crossdomain/6-2.php',
dataType: 'jsonp', //指定响应消息的数据类型
success: function(data){
console.log('4 开始处理响应数据')
console.log(data); }
});
});
跨域知识(二)——JSONP的更多相关文章
- Javascript 跨域知识详细介绍
JS跨域知识总结: 在“跨域”一词经常性地出现以前,我们其实已经频繁地使用它了.如在A网站的img,src指向B网站的某一图片地址,毫无疑问,这在通常情况下都是能正常显示的(且不论防盗链技术):同样, ...
- JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...
- JS跨域知识整理
在“跨域”一词经常性地出现以前,我们其实已经频繁地使用它了.如在A网站的img,src指向B网站的某一图片地址,毫无疑问,这在通常情况下都是能正常显示的(且不论防盗链技术):同样,可以使script标 ...
- 跨域请求之JSONP 一
跨域请求之JSONP 一 跨域请求的方式有很多种, iframe document.domain window.name script XDomainRequest (IE8+) XMLHTTPReq ...
- js跨域交互之jsonp - 看完就能让你了解jsonp原理 (原)
跨域? 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 同源策略? 一般来说 a.com 的网页无法直接与 b.com的服务器沟通, 浏览器的同源策略限制从一个源加载的文档或脚本 ...
- js跨域请求(jsonp)
jsonp是跨域请求的手段之一. jsonp的原理: 先来看看下面这段代码 <!DOCTYPE html> <html lang="en"> <hea ...
- 跨域请求之jsonp的实现方式
ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在sr ...
- 跨域解决方案之JSONP,通过借助调用百度搜索的API了解跨域案例
跨域解决方案之JSONP 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web ...
- 与跨域相关的 jsonp 劫持与 CORS 配置错误
参考文章: CORS(跨域资源共享)错误配置漏洞的高级利用 JSONP劫持CORS跨源资源共享漏洞 JSONP绕过CSRF防护token 读取型CSRF-需要交互的内容劫持 跨域资源共享 CORS 详 ...
- 跨域解决之JSONP和CORS的详细介绍
JSONP跨域和CORS跨域 什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 同源策略 同源策略:域名.协议.端口均相同. 浏览器执行Jav ...
随机推荐
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...
- Python-流程控制 if判断
目录 if 判断 语法 单分支结构 双分支结构 多分支结构 for循环 语法 for + break for + continue for + else range函数 for + if 练习 if ...
- 机器学习实战之Apriori
机器学习实战之Apriori 1. 关联分析 1.1 定义 关联分析是一种在大规模数据上寻找物品间隐含关系的一种任务.这种关系有2种形式:频繁项集和关联规则. (1) 频繁项集(freq ...
- mysql知识点回顾与梳理
一.sql语句执行顺序 from join on where group by avg,sum,count等各种函数 having select distinct order by(asc(升序),d ...
- Linq之Sum用法新体会
1.简单应用,求数组的和,示例: , , , , , , , , , }; double numSum = numbers.Sum(); Console.WriteLine("The sum ...
- sqoop import 和export的问题
sqoop import DB 2 hive(hdfs)是采用JDBC的过程,与传统hive区别在与多走了thrift server接口(稳定性待学习现在还比较模糊没做过大数据量测试),而export ...
- day18 8.jdbc中设置事务隔离级别
设置数据库事务隔离级别特殊需求才有,后面很少用.因为数据库本身是事务隔离级别的,mysql的事务隔离级别是Repeatable read,可以解决脏读和不可重复读.不用设置,人家数据库是有事务隔离级别 ...
- 警告: [SetPropertiesRule]{Context/Loader} Setting property 'useSystemClassLoaderAsParent' to 'false' did not find a matching property.
警告: [SetPropertiesRule]{Context/Loader} Setting property 'useSystemClassLoaderAsParent' to 'false' d ...
- textarea标签中多出的空格
//这么写才能被正确渲染 <textarea></textarea> //这样就会有空格 <textarea> </textarea> 不能换行,涨姿势
- wamp 添加pear
1.下载pear http://pear.php.net/go-pear.phar 2.安装 在目录 D:\wamp\bin\php\php5.5.12 新建文件夹pear,将文件go-pear.ph ...