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. 【心无旁骛】vuex-simple

    这个算是一个小的demo嘛,先放上开源github地址:https://github.com/sascha245/vuex-simple 倒是可以先看下效果 呃呃,因为这个项目所在的目录与平时我们一般 ...

  2. 前缀数组O(n^3)做法

    前缀数组O(n^3)做法 s.substr()的应用非常方便 令string s = "; ); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789&quo ...

  3. c语言学习笔记 - 顺序查找和哨兵查找比较

    今天学习C时用到了顺序查找和哨兵查找,做了一个比较,主要是学习下哨兵查找法 例如在一个数组里查找一个元素,没找到返回-1,找到了则返回这个数组的下标也就是键值. 用循序查找法: void arr_se ...

  4. Java导出excel文件(使用jxl)

    首先要导入jxl的jar包,可以去maven仓库下载:https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl 通过模拟实现创建 ...

  5. node.js 安装步骤

    1.打开链接(http://nodejs.cn/download/) 2.下载自己所需的安装包(32位 or 64位.哪个系统) 3.双击直接安装(成功如下图) 4.点击 Node.js comman ...

  6. 二、Python安装和第一个程序

    <1.Python语言介绍1.官方介绍:Python 是一款易于学习且功能强大的编程语言. 它具有高效率的数据结构,能够简单又有效地实现面向对象编程.Python 简洁的语法与动态输入之特性,加 ...

  7. MATLAB---fopen、fprintf函数

    1 概述 fopen()是个将数据按指定格式读入到matlab中的函数. fprintf()是个将数据按指定格式写入到文本文件中的函数. 2 用法 2.1 fopen函数 matlab中fopen函数 ...

  8. 2019-1-29-dotnet-使用-Qpush-快速从电脑到手机推送文字

    title author date CreateTime categories dotnet 使用 Qpush 快速从电脑到手机推送文字 lindexi 2019-01-29 16:22:56 +08 ...

  9. Layui 获取表单提交数据

    HTML<div class="layui-card-header layuiadmin-card-header-auto"> <form class=" ...

  10. Django项目:CRM(客户关系管理系统)--32--24PerfectCRM实现King_admin自定义操作数据

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...