jsonp跨域的原理及实现
1,什么是跨域?
跨域跨域,跨过域名,笼统来说就是一个域名区请求另外一个域名的数据,但实际上,不同端口、不同域名、不同协议上请求数据都会出现跨域问题。浏览器出于安全考虑会报出异常,拒绝访问。
2,jsonp的原理?
jsonp(json with padding)是一种十分常见的实现跨域请求的手段,利用src属性能跨域请求的特点来实现。
比如:
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
这段代码就实现了引用jQuery的功能,请求成功后返回jQuery的源码。不止script标签,audio,img标签都能 进行跨域请求并且不被浏览器拦截。
想要使用jquery里的方法,就必须引入jquery,换句话说,必须要有这个方法,然后我们才能使用
比如:引用jquery,来实现点击变色的效果:
<body>
<div id="app">点击变色</div>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
<script type="text/javascript">
$('#app').click(function() {
this.style.color = 'red'
})
</script>
</body>
这里可以看到,引用完Jq之后就能调用它封装好的click方法。
也就是说,我们可以提前定义一个包含参数的方法,然后调用的时候把数据当做实参传入就能实现对数据的操作
<script type="text/javascript">
function who(r){
console.log(`我的名字是${r}`)
}
</script>
<script type="text/javascript">
who("小明")
</script>

再深入一点,我们在前台定义一个函数,然后请求后端返回这个函数的调用
现在有一个数据为person,返回给前台使用。
server.js文件里的代码:请求时会返回 一个回调函数 who(小明)
const http =require("http");
http.createServer((req,res)=>{
var person='小明'
res.write(`who("${person}")`)
res.end()
}).listen(3003)
index.html文件里的代码:
<body>
<script type="text/javascript">
function who(r){
console.log(`我的名字是${r}`)
}
</script>
<script src="http://localhost:3003"></script>//请求成功后则执行 who(小明)
</body>
输出结果:

如此一来,就实现了一个简单的跨域获取数据的操作。
3,怎么实现jsonp?
jsonp的实现很简单,就是动态创建一个script标签
比如:点击按钮获取后台数据 后台代码同上面的server.js
<body>
<button id="btn">点击获取数据</button>
<p id="text"></p>
<script type="text/javascript">
function who(r) {
document.getElementById('text').innerText = r
}
document.getElementById("btn").addEventListener("click", () => {
var script = document.createElement("script")
script.src = "http://localhost:3003"
document.body.appendChild(script)
document.querySelector("body script:last-child").remove()
})
</script>
<!-- <script src="http://localhost:3003"></script> -->
</body>

这样写存在一个弊端,就是前后端必须严格的统一,设定好回调函数名称,比如这里回调函数都为 who()
前台只需重新设置下src的值
script.src = "http://localhost:3003?callback=getName"
后台获取传入的callback的值然后重新拼接,
res.write(`${callback}("${person}")`)
- 最后再记录一下jquery中jsonp的使用
$.ajax({
type: 请求方式get|post,
url: 请求地址,
dataType: "jsonp",//最关键的一步,使用jsonp
jsonp: "callback",//回调函数的参数名,默认为callback
jsonpCallback: "callBackFun",//回调函数的函数名
/*
例如这里
jsonp:myCallback
jsonpCallback:getName
则请求地址为http://localhost:3003?myCallback=getName
*/
success:function(){
console.log(this)
},
error:function(){
console.log("error"+this)
}
})
查看更多内容请访问:根号七的网站
jsonp跨域的原理及实现的更多相关文章
- JSONP跨域的原理解析( 一种脚本注入行为)
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于Jav ...
- JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于Jav ...
- Jsonp跨域访问原理和实例
>>什么是跨域 出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,当前域名的js只能读取同域下的窗口属性,即同源策略.而跨域就是通过某些手段来绕过同源策略限制,实 ...
- .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器
1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...
- 【转】JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
- JSONP跨域的原理解析(转)
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...
- JSONP跨域的原理
一种脚本注入行为 在 2011年10月27日 那天写的 已经有 12671 次阅读了 感谢 参考或原文 服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...
- JSONP跨域的原理解析及其实现介绍
JSONP跨域的原理解析及其实现介绍 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-22 JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并 ...
- JSONP跨域的原理解析[转]
转自 http://www.nowamagic.net/librarys/veda/detail/224 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中, ...
- [转载]JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
随机推荐
- YA157C交叉编译环境搭建
目录 1.开发板简介 3.主机搭建交叉编译环境 4.编译第一个ARM Linux程序--Hello World 5.在开发板上运行Hello World程序 6.ssh登录开发板 7.注意 8.she ...
- 正式学习MVC 05
1.剃须刀模板razor的使用 1)混编 循环语法 @model List<MVCStudy.Models.Student> @{ ViewBag.Title = "List&q ...
- 常用css3选择器
<div class="wrapper"> <p class="test1">1</p> <p class=" ...
- js中的0就是false,非0就是true。
在处理js代码判断真假时经常会这么写. var vale = fun();//从某个地方获取的值. if(!value){ 进入这里表示value为false或不存在 }但fun()可能得到的是数字0 ...
- layer打开弹窗时传递参数(content:)
在使用layer打开弹窗时,我希望带一些参数过去,进行某些判断.直接就可以用链接+参数的方式即可. js var userGrade=Mrant layer.open({ title: '权限管理', ...
- "长辈牌"电子产品:有一种评论朋友圈叫给你打电话
一.长辈们使用电子产品的姿势集合 先问你一个问题:「怎么下载搜狗输入法?」 (非广告) 摁?看到这篇文章的你可能都有点懵,不就下载安装就完了吗?但是,真的就只是这样吗? 前一段时间,当家里的长辈问到我 ...
- Mongo Shell CRUD操作
1.创建并使用test数据库 use test; 此时使用show dbs;命令查看当前存在的数据库是查看不到test数据库的,只有当test中insert数据之后才能查看到test数据库 删除数据库 ...
- Educational Codeforces Round 83 (Rated for Div. 2)A--C
题意:给出一个边数为n的等边多边形,问是否可以变成m的等边多边形.条件是同一个中心,共用原顶点. 解析:直接n%m==0即可,这样就是平分了.签到题没得说了. #include<iostream ...
- C++类的详解
目录 一.类成员的访问权限 二.成员变量的命名 三.构造函数 四.析构函数 五.C++程序也很优雅 六.类的其它知识 七.可变参数 八.课后作业 九.版权声明 超女选秀的例子我们玩了很久,为了学习的需 ...
- 测试必知必会系列- Linux常用命令 - cd
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 如何进 ...