转载:http://www.w3cfuns.com/notes/18271/df9ecd8f0ca5e523ae75745a3996c47c.html

JSONP的优缺点
        1.优点
                1.1它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制,JSONP可以跨越同源策略;
                1.2它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持
                1.3在请求完毕后可以通过调用callback的方式回传结果。将回调方法的权限给了调用方。这个就相当于将controller层和view层终于分开了。我提供的jsonp服务只提供纯服务的数据,至于提供服务以 后的页面渲染和后续view操作都由调用者来自己定义就好了。如果有两个页面需要渲染同一份数据,你们只需要有不同的渲染逻辑就可以了,逻辑都可以使用同 一个jsonp服务。
        2.缺点
                2.1它只支持GET请求而不支持POST等其它类型的HTTP请求
                2.2它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
                2.3 jsonp在调用失败的时候不会返回各种HTTP状态码。
                2.4缺点是安全性。万一假如提供jsonp的服务存在页面注入漏洞,即它返回的javascript的内容被人控制的。那么结果是什么?所有调用这个 jsonp的网站都会存在漏洞。于是无法把危险控制在一个域名下…所以在使用jsonp的时候必须要保证使用的jsonp服务必须是安全可信的。

================================================

jquery的$.get $.post $.ajax $.getJSON.

转载:http://www.cnblogs.com/ranzige/p/jquery_get_ajax.html

转载:http://www.jb51.net/article/77470.htm

$.getJSON 的本质是$.get+一个json的参数,get请求才可以跨域。

$.ajax对原声 ajax的一个封装,支持get和post,也可以跨域

================================================

我们通常用的getJSON的用法。

getJSON: function(param) {
var url = param.url,
data = param.data,
success = param.success,
fail = param.fail,
callback = param.callback || 'callback',
timeout = param.timeout || 5000,
maxCount = param.maxCount || 2; var jsonpCallback,
count = -1,
delayID = 0,
s,
self = this,
head = document.head || document.getElementsByTagName('head')[0] || document.documentElement; var tmp = []; if(data) for(var k in data) tmp.push(k + '=' + data[k]); if(!/\?/.test(url)){
url += '?' + tmp.join('&');
}else{
url += '&' + tmp.join('&');
} var addCb = function(){
var time = self.now(),
jsonpCallback = 'vjs_' + time + Math.floor(Math.random()*100); window[jsonpCallback] = function(response) {
destroy(); success.call(this, response,{responseTime: self.now()-time, retryCount: count}); window[jsonpCallback] = null;
}; return jsonpCallback;
}; var destroy = function(){
if(window[jsonpCallback]) window[jsonpCallback] = emptyFn;
clearTimeout(delayID); if (s && s.parentNode) {
head.removeChild(s); s.onload = s.onreadystatechange = null; s = undefined;
}
}; var load = function() {
destroy();
count++;
if (count >= maxCount){
fail && fail.call(this);
return;
} jsonpCallback = addCb(); var jsonpUrl = url; if(/(\=)\?(&|$)/i.test(jsonpUrl)){
jsonpUrl = jsonpUrl.replace(/(\=)\?(&|$)/i,'$1' + jsonpCallback + '$2');
}else{
jsonpUrl += '&' + callback + '=' + jsonpCallback;
} if(param.log) param.log.pushLog('lib getJSON===' + jsonpUrl + '===' + jsonpCallback + '====' + count);
s = document.createElement('script');
s.setAttribute('type', 'text/javascript');
s.setAttribute('src', jsonpUrl); head.insertBefore(s, head.firstChild); delayID = setTimeout(load, timeout);
}; load(); return {
destroy : destroy
}
}

  

jsonp的优缺点的更多相关文章

  1. jsonp的原理,应用场景,优缺点

    在开发测试中,难免会在不同域下进行跨域操作,出于安全性考虑,浏览器中的同源策略阻止从一个域上加载的脚本获取或者操作 另一个域下的文档属性,这时需要进行跨域的方式进行解决,如:使用jsonp ,ifra ...

  2. (三)ajax请求不同源之jsonp跨域

    凡是拥有"src"这个属性的标签都具有跨域的能力,比如<script>.<img>.<iframe>. JS中,我们直接用XMLHttpRequ ...

  3. 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

    1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...

  4. 33、JSONP跨域

    跨域请求数据也是可以的,只不过Ajax这技术不行,而JSONP这种数据格式可以进行跨域.很多年前,浏览器是没有跨域限制的,可以正常跨域,浏览器为了安全和隐私限制了Ajax跨域 JSONP原理就是:将函 ...

  5. CORS 和 JSONP

    跨域资源共享(CORS) 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制. CORS(Cross-Origin Resource Sharing) ...

  6. jsonp与cors跨域解析

    1.浏览器的同源安全策略 没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任.那怎么才算跨域呢? 请求协议http,https的不同 域domain的不同 端口port的不 ...

  7. 详解JS跨域问题

    什么是跨域? 概念:只要协议.域名.端口有任何一个不同,都被当作是不同的域.             JavaScript   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. 实现跨域的N种方法

    从域说起 域: 域是WIN2K网络系统的安全性边界.我们知道一个计算机网最基本的单元就是"域",这一点不是WIN2K所独有的,但活动目录可以贯穿一个或多个域.在独立的计算机上,域即 ...

  9. js 跨域问题 汇总

    前言 相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的.但跨域方法的多种多样实在让人目不暇接.老规矩,碰到这种情况,就只能自己总结一篇博客,作为记录. 正文 1. 什么是跨域 ...

随机推荐

  1. 【hbase】——HBase 写优化之 BulkLoad 实现数据快速入库

    1.为何要 BulkLoad 导入?传统的 HTableOutputFormat 写 HBase 有什么问题? 我们先看下 HBase 的写流程: 通常 MapReduce 在写HBase时使用的是 ...

  2. Linux IPC tcp/ip socket 编程

    模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...

  3. 列表list

    Python是一种面向对象的语言,但它不像C++一样把标准类都封装到库中,而是进行了进一步的封装,语言本身就集成一些类和函数,比如print,list,dict etc. 给编程带来很大的便捷 Pyt ...

  4. PDO链接mysql学习笔记

    <?php //PDO链接mysql//dsn三种写法: //dsn01 $dsn = 'mysql:host=localhost;dbname=mysql'; //$dsn = 'mysql: ...

  5. android 利用Path.cubicTo 画 贝塞尔曲线

    Path.cubicTo void android.graphics.Path.cubicTo(float x1, float y1, float x2, float y2, float x3, fl ...

  6. RedHat 6.2 Linux修改yum源免费使用CentOS源

    在没有光盘的情况,需要安装软件包,就要用到共网的yum源来安装了. RedHat linux 默认是安装了yum软件的,但是由于激活认证的原因让redhat无法直接进行yum安装一些软件,如果我们需要 ...

  7. c++形参改变实参(对指针的理解

    这几天搞逻辑比较晕,居然把指针的概念都混淆了. eg:int *p;//当然不对指针初始化在有些编译器是通不过编译的,比如VS(尤其是选中了SDL) 指针p是一个对象,定义开始没有分配了内存空间,只是 ...

  8. Vijos1053 Easy sssp[spfa 负环]

    描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...

  9. JAVA单例

    单例模式: 1 public class Person{ 2 public static Person per//定义一个静态变量,用来储存当前类的对象 3 private Person()//构造方 ...

  10. Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)

    http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2- ...