概念:

  什么叫跨域?

  同源策略:它是由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的更多相关文章

  1. 跨域cors方法(jsonp,document.domain,document.name)及iframe性质

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  2. 004. 前端跨域资源请求: JSONP/CORS/反向代理

    1.什么是跨域资源请求? https://www.cnblogs.com/niuli1987/p/10252214.html 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...

  3. [转]vue跨域解决方法

      vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...

  4. JS中实现跨域的方法总结

    今天早上在地铁看了点基础知识的考察题,看到了一个JS跨域的问题,仔细想了想自己脑子里竟然只剩下jsonp跨域和用nginx反向代理进行跨域,想着还有别的几种方法,就是想不起来,这个人呢,一上岁数这个脑 ...

  5. AJAX四种跨域处理方法

    同源策略 同源策略 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 具体定义是:一段脚本向后台请求数据,只能读取属于同一协议名. ...

  6. js实现跨域的方法

    由于同源策略的限制,XMLHttpRequest只允许请求当前源(包含域名.协议.端口)的资源. json与jsonp的区别:    JSON是一种数据交换格式,而JSONP是一种依靠开发人员创造出的 ...

  7. Ajax跨域通信方法

    1.Jsonp.document.domain+iframe.window.name.window.postMessage.服务器上设置代理页面. 2.Jsonp(json with padding) ...

  8. 面试汇总——知道什么是同源策略吗?那怎么解决跨域问题?知道 JSONP 原理吗?

    本文是面试汇总分支——知道什么是同源策略吗?那怎么解决跨域问题?知道 JSONP 原理吗?. 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能, ...

  9. JS访问或设置cookie的方法+跨域调用方法

    无意中从163网站获取的JS访问或设置cookie的方法,Log到日志上以防遗忘 //COOKIE功能检查function fCheckCookie(){    if(!navigator.cooki ...

随机推荐

  1. [GitHub]第四讲:合并分支

    本地两个分支合并 先从最简单的一种情况着手.现在项目只有一个 master 分支,我来新建一个 idea 分支,实现自己的想法,commit 一下.那现在仓库内的情况就是这样的 这个是前面已经见过的情 ...

  2. Google Guava的5个鲜为人知的特性

    译文出处: 花名有孚   原文出处:takipi.com Google Guava有哪些比较冷门但却又实用的特性呢? 它是最流行的开源库之一,你应该听过它的大名,它诞生的地方正是人们举办真正的魁地奇比 ...

  3. L​i​n​u​x​下​配​置​T​o​m​c​a​t

    ***安装***   安装JDK chmod a+x jdk-1_5_0_06-linux-i586-rpm.bin ./jdk-1_5_0_06-linux-i586-rpm.bin 敲几次空格就O ...

  4. 类装载器DexClassLoader (android内核剖析)

    在java环境中,有个概念叫做"类装载器",其作用是动态装载Class文件.标准的java SDK中有一个ClassLoader类,借助它可以装载 想要的Class文件,每个Cla ...

  5. 4.5、Libgdx运行日志管理

    (原文:http://www.libgdx.cn/topic/47/4-5-libgdx%E8%BF%90%E8%A1%8C%E6%97%A5%E5%BF%97%E7%AE%A1%E7%90%86) ...

  6. Mahout 系列之----共轭梯度

    无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ...

  7. 【Unity插件】LitJson杂谈

    距离上一次更新博客已有一段时间了,一实习就懒了,嘿嘿.这次谈一下在实习里新碰到的一个Unity插件--LitJson(也可以去官网下载最新版). 开场白 LitJson是一个开源项目,比较小巧轻便,安 ...

  8. 【Qt编程】Qt学习之Window and Dialog Widgets

    Qt Creator 提供的默认基类只要QMainWindow.QWidget和QDialog三种.其中,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,这两个 ...

  9. jQuery 瀑布流插件: Wookmark

    原文链接: jQuery Wookmark 在线示例: jQuery Wookmark Demo Wookmark官网: http://www.wookmark.com/jquery-plugin 翻 ...

  10. 在android C/C++ native编程(ndk)中使用logcat

    最近在研究Android 2.2 源代码的C/C++层,需要对代码进行一些调试,但是奇怪的是,直接添加LOGD("XXXXXXXX");,使用logcat却看不到任何输出,换成LO ...