jsonp产生的背景

1.从原网站向目标网站(服务端)发送ajax请的时候,由于浏览器的安全策略(这两个网站只要域名,端口,协议 有一个不同就不允许请求访问)导致跨域,从而请求无法正常进行。

2.Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>)。

3.于是可以判断,当前阶段如果想通过纯web端跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。

4.从服务器端请求到的js代码是立即执行的,想要处理请求到的数据,可以把服务器端的数据放在一个方法里面,跟随数据一起返回,浏览器端获取到js代码后,立即执行此方法,于此同时浏览器端需要先定义这个方法,供服务器返回的js调用,这个方法就是所谓的callBack。

做实验,了解大概流程

比如服务端(www.abc.com)的根目录下有个 test.js 文件,代码如下:

alert('hello')

本地服务器127.0.0.1:3000 下有个demo.html页面代码如下:

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript" src='http://www.abc.com/test.js'></script> </body>
</html>

这时候页面就会弹出 'hello', 因为alert是浏览器自带的函数。

这时候 把 test.js 的内容改成如下:

testFunction('hello')

再打开demo.html页面,就会报错如下:

因为在浏览器端没有找到testFunction方法,这就需要在浏览器端要事先定义好要执行的这个testFunction方法。

在浏览器加上testFunction方法后,代码如下:

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
var testFunction = function(data){
alert('执行testFunction' + data)
}
</script>
<script type="text/javascript" src='http://127.0.0.1:3000/users'></script>
</body>
</html>

运行demo.html 结果如下:

实验总结

1.服务端返回一个函数,并且函数包裹着浏览器端需要的数据。

2.浏览器端定义一个函数,跟服务端返回的函数名一样,用来处理获取到的数据。

浏览器端具体代码实现

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
var testFunction = function(data){
alert('执行testFunction' + data.message)
}
</script>
<!-- 把浏览器定义的方法以参数的形式传递给服务端就是 callback=testFunction -->
<script type="text/javascript" src='http://127.0.0.1:3000/users?callback=testFunction'></script>
</body>
</html>

服务端代码,以node.js为例

const express = require('express');
const app= express(); app.get('/users', (req, res)=>{
// 这一步JSONP必备
var _callback = req.query.callback;
// 这个responseData是后台要传回给前台的数据
var responseData = { status: '', message: 'hello, 你好'};
if (_callback){
// 这两步设置发送也是NODE.JS发送JSONP必备
res.type('text/javascript');
res.send(_callback + '(' + JSON.stringify(responseData) + ')');
}
else{
res.json(responseData);
}
});
app.listen(, ()=>{
console.log('Server is running at http://localhost:8080')
})

完成,jsonp的过程就是这样了,jquery这类框架的 jsonp 是其实就把这个过程给封装好了, 由于需要把参数都放在 <script> 的 src里面向服务端请求, 所以jsonp只持之get请求。

jsonp 原理 并模拟实现一个简单的jsonp的更多相关文章

  1. Linux——模拟实现一个简单的shell(带重定向)

    进程的相关知识是操作系统一个重要的模块.在理解进程概念同时,还需了解如何控制进程.对于进程控制,通常分成1.进程创建  (fork函数) 2.进程等待(wait系列) 3.进程替换(exec系列) 4 ...

  2. tomcat原理解析(一):一个简单的实现

    tomcat原理解析(一):一个简单的实现 https://blog.csdn.net/qiangcai/article/details/60583330 2017年03月07日 09:54:27 逆 ...

  3. 自己模拟的一个简单的web服务器

    首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...

  4. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  5. 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序

    对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...

  6. 自己模拟的一个简单的tomcat

    servlet容器的职责 总的来说,一个全功能的servlet容器会为servlet的每个HTTP请求做下面的一些工作: 1,当第一次调用servlet的时候,加载该servlet类并调用servle ...

  7. jQuery的ajax跨域 Jsonp原理

    1.Jsonp Jsonp(json with padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. Jsonp是为了解决ajax跨域发送http请求出现的,利用S ...

  8. java模拟而一个电话本操作

    哈哈.大家平时都在使用电话本.以下使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public ...

  9. 手把手教你实现一个通用的jsonp跨域方法

    什么是jsonp JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1 ...

随机推荐

  1. Windows Server 2016分层式存储,使用PowerShell修改底层介质类型

    新部署的备份服务器,需要做分层式存储,按照网上最常见一个作者叫刘兵的文档,名叫<Windows Server2016分层存储技术详细拆解手册>,做到使用PowerShell修改磁盘的Med ...

  2. AWK程序设计语言

    一. AWK入门指南 Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务.本章是个入门指南,让你能够尽快地开始编写你自己的程序.第二章将描述整个语言,而剩下的章节将向你展示 ...

  3. android如何自动切换后台app

    在做 android 前端性能自动化测试时,你是否经历过这样的场景:依次启动 A.B.C 三个 app,其中 C 是被测 app, 当当前屏幕切换到 B 进行相关操作后,如何通过封装方法实现自动切换会 ...

  4. java-面试题为什么redis这么快

    文章:为什么说Redis是单线程的以及Redis为什么这么快! 文章比较详细,有些细节可能需要注意. 1,比如CPU不是redis的瓶颈 2,随着连接数的增加,并发会降低等.

  5. ora-01847:月份中日的值必须介于 1 和当月最后一日之间

    今天解决了一个奇葩问题: ORA-01847: 月份中日的值必须介于 1 和当月最后一日之间 将数据从一个视图倒入到一个同结构的表中,但是老报错,也就那么几个字段,肉眼真看不出来什么问题,但是既然报这 ...

  6. ngnix之笔记

    ############################################################################# 我们在使用的时候会遇到很多的恶意IP攻击,这 ...

  7. SQL CASE Syntax

    CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE ...

  8. linux中telnet后退出连接窗口

    [root@a cron]# telnet www.baidu.com 80Trying 115.239.211.112...Connected to www.baidu.com.   #显示conn ...

  9. React使用JSX语法

    目录: 1.在React项目中启用JSX语法 2.在JSX中写js代码 3.使用JSX注意事项 1.在React项目中启用JSX语法  <--返回目录 JSX语法:符合xml规范的js语法 JS ...

  10. jquery resize()方法 语法

    jquery resize()方法 语法 作用:当调整浏览器窗口的大小时,发生 resize 事件.resize() 方法触发 resize 事件,或规定当发生 resize 事件时运行的函数.大理石 ...