浅析跨域的方法之一 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 ...
随机推荐
- 【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例
本篇博客主要记录一个完整的TCP客户/服务器实例的编写,以及从这个实例中引发的对僵死进程的处理等问题. 1. TCP客户/服务器功能需求 本实例完成以下功能: (1) 客户从标准输入读入一行文本,并写 ...
- springMVC源码分析--容器初始化(一)ContextLoaderListener
在spring Web中,需要初始化IOC容器,用于存放我们注入的各种对象.当tomcat启动时首先会初始化一个web对应的IOC容器,用于初始化和注入各种我们在web运行过程中需要的对象.当tomc ...
- 简单模拟 Spring
简单的理解Spring的实现过程,模拟了Spring的读取配置文件 项目结构
- eclipse进行关联代码
关联代码找了半天,终于找到了详细解说的: http://blog.csdn.net/long2010yu2010/article/details/8497505
- Android进阶(十二)Fragment VS Activity
Fragment VS Activity Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这 ...
- 简单的C语言猜数字小游戏
猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...
- AJAX+jQuery+ASP实现实时验证身份证信息是否已存在---人事系统
很多时候在网站上注册时,我们会发现,注册表单通常需要检查用户名和电子邮件地址的可用性:从而确保用户之间不拥有相同的用户名和电子邮件地址:一些网站喜欢在用户提交填写的用户信息时,做信息可用性的检查,而一 ...
- 深入解析Linux中的fork函数
1.定义 #include <unistd.h> #include<sys/types.h> pid_t fork( void ); pid_t 是一个宏定义,其实质是int, ...
- Css的学习之旅-css的选择器(2)
1.最常用的是派生选择器:eg:ul li{ color:red} 2.id选择器:eg:#id{color:red} 3.类选择器:设置标签的class = "",类似id.用点 ...
- 《java入门第一季》之面向对象匿名内部类面试题
面试题一: /* 按照要求,补齐代码 interface Inter { void show(); } class Outer { // ...