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的更多相关文章

  1. Javascript 跨域知识详细介绍

    JS跨域知识总结: 在“跨域”一词经常性地出现以前,我们其实已经频繁地使用它了.如在A网站的img,src指向B网站的某一图片地址,毫无疑问,这在通常情况下都是能正常显示的(且不论防盗链技术):同样, ...

  2. JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)

    1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...

  3. JS跨域知识整理

    在“跨域”一词经常性地出现以前,我们其实已经频繁地使用它了.如在A网站的img,src指向B网站的某一图片地址,毫无疑问,这在通常情况下都是能正常显示的(且不论防盗链技术):同样,可以使script标 ...

  4. 跨域请求之JSONP 一

    跨域请求之JSONP 一 跨域请求的方式有很多种, iframe document.domain window.name script XDomainRequest (IE8+) XMLHTTPReq ...

  5. js跨域交互之jsonp - 看完就能让你了解jsonp原理 (原)

    跨域? 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 同源策略? 一般来说 a.com 的网页无法直接与 b.com的服务器沟通, 浏览器的同源策略限制从一个源加载的文档或脚本 ...

  6. js跨域请求(jsonp)

    jsonp是跨域请求的手段之一. jsonp的原理: 先来看看下面这段代码 <!DOCTYPE html> <html lang="en"> <hea ...

  7. 跨域请求之jsonp的实现方式

    ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在sr ...

  8. 跨域解决方案之JSONP,通过借助调用百度搜索的API了解跨域案例

    跨域解决方案之JSONP 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web ...

  9. 与跨域相关的 jsonp 劫持与 CORS 配置错误

    参考文章: CORS(跨域资源共享)错误配置漏洞的高级利用 JSONP劫持CORS跨源资源共享漏洞 JSONP绕过CSRF防护token 读取型CSRF-需要交互的内容劫持 跨域资源共享 CORS 详 ...

  10. 跨域解决之JSONP和CORS的详细介绍

    JSONP跨域和CORS跨域 什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 同源策略 同源策略:域名.协议.端口均相同. 浏览器执行Jav ...

随机推荐

  1. [转]C#线程同步(1)- 临界区&Lock

    第一印象,C#关于线程同步的东西好多,保持了C#一贯的大杂烩和四不象风格(Java/Delphi).临界区跟Java差不多只不过关键字用lock替代了synchronized,然后又用Moniter的 ...

  2. [转]Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率

    Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试并查看 ...

  3. 图像复原MATLAB实现

    前言:本篇博客先介绍滤波器滤除噪声,再介绍滤波器复原,侧重于程序的实现. 一:三种常见的噪声 二:空间域滤波 空间域滤波复原是在已知噪声模型的基础上,对噪声的空间域进行滤波.空间域滤波复原方法主要包括 ...

  4. redhat linux卸载自带的Java1.4.2安装JDK6

    一.卸载jdk1.4 由于Redhat Enterprise Linux 5.6 中自带安装了jdk1.4.2的,所以在安装jdk1.6前我把jdk1.4.2的卸了,步骤如下: 1.打开终端输入 yu ...

  5. js前台中获取后台传的值

    后台controller String ifOffice = "yes";req.setAttribute("ifOffice", ifOffice); 前台j ...

  6. 【One by one系列】一步步开始使用Redis吧(一)

    One by one,一步步开始使用Redis吧(一) 最近有需求需要使用redis,之前也是随便用用,从来也没有归纳总结,今天想睡觉,但是又睡不着,外面阳光不错,气温回升了,2019年6月1日,成都 ...

  7. webService学习五(插入片,---监控方法)

    WS Explorer工具的使用: 1- web服务浏览器 2-将对应的路径copy到这里 - 3- 4-- 5-- 6--请求的数据: 7--相应数据 二.使用TCP/IP Monitor-拦截HT ...

  8. js中的观察者模式与发布者/订阅者模式的区别?

  9. MAC中已有的虚拟环境在pycharm 中进行调用

    首先确定虚拟环境的路径: 打开工作环境配置文件,找到工作目录: 在pycharm中解释器中找到工作目录中对应的虚拟环境进行配置就可以了

  10. 我的常用vs code 插件

    换了台电脑重新装上了VS CODE,但是用起来后发现非常不顺手,突然醒悟原来还没有装上插件. 正动手装插件,但又一脸茫然了,我以前都装了些什么插件来着?因为平时根本不会去几插件的名字啊,只能靠搜搜一些 ...