浅析跨域的方法之一 JSONP
概念:
什么叫跨域?
同源策略:它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。
所谓同源是指,域名,协议,端口相同。
同源的脚本才会被执行。
例如在www.aaa.com/index.aspx里希望获得www.bbb.com/Map.ashx返回的数据,正常的ajax无法获取。
跨域即绕过同源策略取得数据。
但是凡事都有特例,想想我们常写的
<img src="http://www.baidu.com/img/bd_logo1.png" />
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js"></script>
可以很轻松获取到所需的东西,这不就是跨域的一种方式吗?
而jsonp重点就是借助script标签来完成跨域了。
原理:
1、www.aaa.com/index.aspx下的head里写:
<script type='text/javascript'>
function Show(name){
alert("I'm " + name);
}
</script>
<script type='text/javascript' src="www.bbb.com/test.js"></script>
2、www.bbb.com/test.js里面写:
Show("jerry");
这样运行www.aaa.com/index.aspx时,会弹出"I'm jerry"没什么疑问。
正是运用这个原理,我们可以做更多的事情,获取跨域数据,执行回调函数。
例1:
在第一个页面head中写如下几句:
<script type="text/javascript">
function myFn(jsonObj){
alert("welcome, " + jsonObj.name);
}
</script>
<script type="text/javascript" src="www.bbb.com/Map.ashx?callback=myFn"></script>
在www.bbb.com/Map.ashx中写下:
string callback=context.Request.QueryString["callback"];
string json="{'name':'jerry'}"; //服务端处理后要传回的数据
context.Response.Write(callback + "(" + json + ")"); //结果为myFn({'name':'jerry'})
其实很好理解,首先定义了函数myFn,然后跨域的script标签通过QueryString传了一个叫做callback的参数,值为myFn。
这时服务端获取到其callback参数的值,并通过字符串拼接的方式输出 myFn({'name':'jerry'})
这句话直接在第一个页面中运行了。这样不仅跨域得到了数据,还在获得数据之后执行了回调函数。
值得注意的是第一个页面中地址栏传值的参数名要和服务端获取的参数名相同。
例2、jquery中的$.ajax跨域
jquery是如此的方便以至于我用过之后便对它爱不释手。
例1中的服务端不变,在客户端调用时变为:
function myFn(jsonObj){
alert("welcome, " + jsonObj.name);
}
$.ajax({
url:"www.bbb.com/test.ashx",
dataType:"jsonp",
jsonp:"callback", //参数名
jsonpCallback:"myFn", //参数值,即回调函数名
success:function(data){
//成功了会自动弄个执行返回的js,即服务端拼接出的myFn({'name':'jerry'});
//而后再执行此处代码
}
});
例3、当只需要数据,不需要执行函数时
服务端:
string json="{'name':'jerry'}"; //服务端处理后要传回的数据
context.Response.Write(json);
客户端:
$.ajax({
url:"www.bbb.com/test.ashx",
dataType:"jsonp",
success:function(data){
//会报错,无法只返回数据。必须返回方法名+数据才可以
}
});
例3会报错!
在日常工作中很有用处,如有理解不到位还望指正!
浅析跨域的方法之一 JSONP的更多相关文章
- 跨域cors方法(jsonp,document.domain,document.name)及iframe性质
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- 004. 前端跨域资源请求: JSONP/CORS/反向代理
1.什么是跨域资源请求? https://www.cnblogs.com/niuli1987/p/10252214.html 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...
- [转]vue跨域解决方法
vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...
- JS中实现跨域的方法总结
今天早上在地铁看了点基础知识的考察题,看到了一个JS跨域的问题,仔细想了想自己脑子里竟然只剩下jsonp跨域和用nginx反向代理进行跨域,想着还有别的几种方法,就是想不起来,这个人呢,一上岁数这个脑 ...
- AJAX四种跨域处理方法
同源策略 同源策略 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 具体定义是:一段脚本向后台请求数据,只能读取属于同一协议名. ...
- js实现跨域的方法
由于同源策略的限制,XMLHttpRequest只允许请求当前源(包含域名.协议.端口)的资源. json与jsonp的区别: JSON是一种数据交换格式,而JSONP是一种依靠开发人员创造出的 ...
- Ajax跨域通信方法
1.Jsonp.document.domain+iframe.window.name.window.postMessage.服务器上设置代理页面. 2.Jsonp(json with padding) ...
- 面试汇总——知道什么是同源策略吗?那怎么解决跨域问题?知道 JSONP 原理吗?
本文是面试汇总分支——知道什么是同源策略吗?那怎么解决跨域问题?知道 JSONP 原理吗?. 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能, ...
- JS访问或设置cookie的方法+跨域调用方法
无意中从163网站获取的JS访问或设置cookie的方法,Log到日志上以防遗忘 //COOKIE功能检查function fCheckCookie(){ if(!navigator.cooki ...
随机推荐
- numpy教程:快速傅里叶变换模块numpy.fft
http://blog.csdn.net/pipisorry/article/details/51050297 快速傅里叶变换 NumPy中,fft模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...
- Java-IO之InputStreamReader和OutputStreamWriter
InputStreamReader和OutputStreamWriter是字节流通向字符流的桥梁.它使用指定的差染色体读写字节并将其解码为字符.InputStreamReader的作用是将字节输入流转 ...
- ROS(indigo)国外开源示例包括多机器人控制等基于V-Rep和Gazebo的仿真
ROS(indigo)国外开源示例包括多机器人的V-Rep和Gazebo仿真等 1 micros_swarm_framework 使用超级经典的stage. http://wiki.ros.org/m ...
- SIM900A设备在保加利亚无法正常使用GPRS问题
1. SIM900A设备在保加利亚GPRS功能无法正常使用 我们一款手持设备采用SIM900A模块,在发货之前测试正常,但到了保加利亚,客户发现无法正常上网,我们技术支持反馈的邮件反馈的现象 ...
- 利用Dijkstra算法实现记录每个结点的所有最短路径
最近在做PAT时发现图论的一些题目需要对多条最短路径进行筛选,一个直接的解决办法是在发现最短路径的时候就进行判断,选出是否更换路径:另一个通用的方法是先把所有的最短路径记录下来,然后逐个判断.前者具有 ...
- Ubuntu14.04安装配置Chrome浏览器
1.获取软件 32位版本: wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb 64位版本: w ...
- MacTalk·人生元编程 - 读书笔记
简介 <MacTalk·人生元编程>是一本随笔文集,主要内容来自作者的微信公众平台"MacTalk By 池建强".本书撰写于2013年,书中时间线却不止于此.作者以一 ...
- ROS_Kinetic_10 ROS程序基础Eclipse_C++(一)
ROS_Kinetic_10 ROS程序基础Eclipse_C++(一) 编写简单的消息发布器和订阅器 (C++) http://wiki.ros.org/cn/ROS/Tutorials/Writi ...
- ios入门OC_UI晋级学什么?
1. OC 语法初步, 你可能学到面向对象最近本的概念, 并且可以大致的建立几个自以为是的类,但这仅仅是开始. 你知道为什么面向对象要有3大特性么.知道他们是用到什么设计模式的么 2. 你可能学到了N ...
- 使用spine骨骼动画制作的libgdx游戏
(官网:www.libgdx.cn) Super Spineboy是一个使用Spine和libgdx开发的跨平台游戏(Windows,Mac,Linux),Spine是一个2D游戏动画工具.Super ...