浅析跨域的方法之一 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模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...
- iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 简单介绍: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 ...
- Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐号的管理权限
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38817915,专题目录:http://blog.csdn.net/dba_huangzj ...
- 《java入门第一季》之ArrayList集合小案例
案例一:去除集合里面的重复元素 package cn.itcast_04; import java.util.ArrayList; /* * ArrayList去除集合中字符串的重复值(字符串的内容相 ...
- android加载大图,防止oom
高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...
- android 开源图表库MPChart最简单使用方法示例教程Demo--折线图 柱状图
转载请注明本文出处:http://blog.csdn.net/wingichoy/article/details/50428246 MPChart是android上一款强大的图表开源库,他可以轻松的绘 ...
- 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
Swap的简单实现 //C语言方式(by-pointer): template <typename Type> bool swapByPointer(Type *pointer1, Typ ...
- Win 32 编程之按钮消息响应(代码小错误修复)
最近不想用MFC写东西了,有没有安装Qt和其他图形化开发环境,只能捣鼓API了.于是乎,就有了以下的学习-- 首先,老套的创建个Windows窗口,由于自己有点小懒,就直接用Hello Word的源码 ...
- PSAM 卡的应用 操作方法
PSAM 卡的应用 PSAM 功能 终端安全存储模块 PASM 常用于 脱机交易的 安全认证 脱机交易的流程 1.卡片对持卡人的认证(防止 ...
- Linux 套接字编程中的 5 个隐患(转)
本文转自IBM博文Linux 套接字编程中的 5 个隐患. “在异构环境中开发可靠的网络应用程序”. Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是开发新 ...