一种跨域技术:JSONP
来源:互联网 发布:淘宝的pc端是什么意思 编辑:程序博客网 时间:2024/06/06 09:46
跨域技术是前端面试中常见话题。JSONP就是一种跨域技术我撰写此文是为了加深对JSONP的印象
何为跨域?
A resource makes a cross-origin HTTP request when it requests a resource from a domain or port which is different from the one which the first resource itself serves. For example, an HTML page served from http://domain-a.com makes an <img> src request for http://domain-b.com/image.jpg. Many pages on the web today load resources like CSS stylesheets, images and scripts from separate domains.译文:浏览器请求与当前域或者窗口不同的域或窗口。这种请求被称为被称为跨域请求。请求CSS样式表,JS脚本也在此列,这在互联网是很常见的。
为什么要有专门支持跨域的技术?
因为浏览器遵循同源策略,严格限制跨域。何为同源,即协议、域名、端口相同。
有了跨域技术支持,就可以访问任意站点的任意资源了吗?
不是,需要被跨域的网站支持
什么是JSONP?
下面这段话来自<JS高程>,JSONP是JSON with padding的简写,是应用JSON的新方法。JSONP看起来与JSON差不多,只不过是包含在里函数调用中的JSON。举个栗子,同样的内容:JSON返回的是:{"name":"achao"}JSONP返回的是callbackFuncName({"name":"achao"})callbackFuncName是浏览器传递过去的回调函数名,是自定义的。
JSONP请求:
function handleResponse(response) { console.log(response);}var script=document.createElement("script");script.src="http://freegeoip.net/json/?callback=handleResponse";document.body.insertBefore(script,document.body.firstChild);
http://freegeoip.net/json/ 这个站点提供了JSONP服务,console.log是你主机的地理信息:
city:"Hangzhou"country_code:"CN"country_name:"China"ip:"183.157.160.24"latitude:30.2936longitude:120.1614metro_code:0region_code:"33"region_name:"Zhejiang"time_zone:"Asia/Shanghai"zip_code:""
JSONP的ajax支持
<!--html--><button class="btn"></button>
//JS$(document).ready(function() { $(".btn").click(function() { $.ajax({type: "GET", crossDomain : true, url: "http://freegeoip.net/json/", dataType: "jsonp", jsonp: "jsonp", jsonpCallback: "myJsonMethod" }); }); }); function myJsonMethod(response){ console.log (response); }
response:
myJsonMethod({"ip":"183.157.160.24","country_code":"CN","country_name":"China","region_code":"33","region_name":"Zhejiang","city":"Hangzhou","zip_code":"","time_zone":"Asia/Shanghai","latitude":30.2936,"longitude":120.1614,"metro_code":0});
ajax+php:php来自不同源的站点
<button class="btn"></button>
//JS $(document).ready(function() { $(".btn").click(function() { $.ajax({type: "GET", crossDomain : true, url: "http://120.77.34.254/test/test.php", dataType: "jsonp", jsonpCallback: "myJsonMethod" }); }); }); function myJsonMethod(response){ console.log (response); }
//PHP<?php header('content-type: application/json; charset=utf-8');$data = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);echo $_GET['callback'] . '('.json_encode($data).')';
response:
myJsonMethod({"a":1,"b":2,"c":3,"d":4,"e":5})
JSONP的优缺点(这个在面试会问到)
优点:a)支持老式浏览器
关于支持老式浏览器:https://stackoverflow.com/questions/12296910/so-jsonp-or-cors
缺点:a)JSONP是从其他域中加载代码执行,如果其他域不安全,在响应中夹带一些恶意代码,此时只能放弃JSONPb)要确定JSONP请求是否失败并不容易。HTML5给<script>标签增加的onerror事件处理程序没有得到任何浏览器支持。开发人员不得不使用计时器,但是这并不如任意,因为每个用户上网的速度和带宽不尽相同。c)只支持get请求
1 0
- 一种跨域技术:JSONP
- 跨域技术JSONP
- JSONP跨域技术
- JSONP跨域技术
- 前端跨域技术----jsonp
- JSONP跨域的原理解析---一种脚本注入行为
- 前端跨域技术之JSONP
- JSONP--实现跨域的ajax技术
- 跨域技术(JSONP与CROS)
- 项目技术总结一之JSONP实现跨域调度
- Ajax跨域请求——jsonp技术
- 技术点-Jsonp跨域请求-概念性总结
- 技术点-Jsonp跨域请求-技术性总结
- jsonp 跨域原理:深入浅出 jsonp
- jsonp 跨域访问
- JSONP跨域访问
- jsonp跨域访问
- jsonp跨域请求
- Linux常用的一些内核参数(调优)
- 面试算法题:二叉树的平衡性检测
- BlueROV-4: DroneKit, MAVLink and Companion Computers
- Leetcode 371(Java)
- 徒手启动jenkins-体会docker好处
- 一种跨域技术:JSONP
- luogu 1521-求逆序对
- TT打字练习软件(dos)
- 【AOJ 865】青铜莲花池(BFS)
- 运维基础——Zabbix快速配置和使用
- gnu linker 的名字 ld.exe
- Android框架之路——Fragmentation的使用(流式交互Demo)
- Head First SQL 第九章
- 运维第十天学习