一、jsonp原理

本质并不是ajax,只是执行了跨域js,所以该方式只支持get方式

html中,所有带src属性的标签都可以跨域script img iframe

所以,可以通过script加载其他域的一段动态脚本,这段脚本包含了所要的数据信息。

二、实现方式

2.1 自己封装jsonp方法:

 function jsonp(url,data,callback){
var script=document.createElement('script');
document.body.appendChild(script); data=data||{};
data.callback='cb'+new Date().getTime();
window[data.callback]=callback; url+="?"+$.param(data);
script.src=url;
script.onload=function(){
document.body.removeChild(script);
}
}

方法说明:

jsonp(url,data,callback):

url:后台的url方法,无需加[?callback=?]封装方法里头已经做了处理。

data:请求参数

callback:回调函数

调用方式:

jsonp('http://b.test.com:8888/'+path+'/public/monitorJsonp.do',{test:"ok"},function(data){
alert("自己封装jsonp方式调用:"+data[].name);
});

2.2 $.getJSON方式

$.getJSON('http://b.test.com:8888/'+path+'/public/monitorJsonp.do?callback=?',{test:"ok"},function(data){
alert("getJSON方式调用:"+data[].name);
});

封装的jsonp和$getJSON有点相似,相关方法参考2.1 jsonp的方法说明。

尤其要注意$getJSON这方法的url后面一定要加[?callback=?],否则getJSON会默认为一个普通的ajax请求,就会报非同源问题的错误。

2.3 ajax指定返回jsonp类型

ajax方式一

    $.ajax('http://b.test.com:8888/'+path+'/public/monitorJsonp.do?callback=?',{
        data:{test:"ok"},
        dataType:'jsonp'
    }).done(function(data){
        alert("Ajax方式一调用: "+data[].name);
    });

ajax方式二

      $.ajax({
url:"http://b.test.com:8888/"+path+"/public/monitorJsonp.do",
dataType:'jsonp',
data:'',
jsonp:'callback',
success:function(data) {
alert("Ajax方式调用: "+data[].name);
},
error:function(data){
alert("请求错误,请稍后再试!");
}
});

要制定好dataType为jsonp注意要小写,此外,jsonp要设置为callback。

java代码

    @RequestMapping(value="/monitorJsonp")
@ResponseBody
public void monitorJsonp(HttpServletRequest request,HttpServletResponse response){
try {
response.setContentType("text/plain");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", ); PrintWriter out = response.getWriter();
String callback = request.getParameter("callback");
out.print(callback+"([ { name:'shawWey',age:'19'},{ name:'joe',age:'20'}] );");
out.print(callback); } catch (IOException e) {
e.printStackTrace();
}
}

2.4 jsonp jsonpCallback 参数说明

jsonp:制定回调参数名称比如为callback或者其他名字,当然这儿改了相关后台获取回调函数的名称也要进行相应的修改。

jsonpCalllback:回调函数参数的名称

测试:

例如设置如下:

jsonp:"shaw",

jsonpCallback:"jsonpCallback"

请求如下,回调函数的名称以及值都改变了。

三、jsonp优缺点:

优点:

比XML轻了很多,没有那么多冗余的东西。
JSON也是具有很好的可读性的,但是通常返回的都是压缩过后的。不像XML这样的浏览器可以直接显示,浏览器对于JSON的格式化的显示就需要借助一些插件了。
在JavaScript中处理JSON很简单。
其他语言例如PHP对于JSON的支持也不错。

缺点:

只支持get方式  
后端代码要调整

JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,在提交开发资源之前必须认真考虑它们。
  第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。
  JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。

跨域问题解决方案:代码下载

JSONP解决跨域方案的更多相关文章

  1. AJAX跨域问题解决方法(2)——JSONP解决跨域

    JSONP是什么?JSON全称为JSON with Padding,是JSON的一种补充的使用方式,不是官方协议. 使用JSONP服务器后台要改动吗?JSONP不同于一般的ajax请求返回json对象 ...

  2. JSONP解决跨域问题,什么是JSONP(转)

    原文链接:https://www.cnblogs.com/xinxingyu/p/6075881.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的 ...

  3. 详解Jquery和AngularJs,Servlet中jsonp解决跨域问题(转)

    众所周知,jsonp可以解决跨域问题,下面是我在查阅资料和实际项目使用后的一些总结. Jquery中jsonp的使用 //myUrl = "http://localhost:8090/api ...

  4. jsonp解决跨域问题

    日常开发网页中,时常遇到跨域问题,通常解决办法:后端提供的接口支持jsonp格式,前端采用dataType:jsonp. 一:Jquery封装的AJAX,dataType:jsonp格式的方法: $. ...

  5. CORS,jsonp解决跨域问题

    同源和跨域 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上 ...

  6. 非jsonp解决跨域问题

    1.服务器端解决跨域问题:配置filter在filter中设置请求头import java.io.IOException; import javax.servlet.Filter;import jav ...

  7. Jsonp post 跨域方案

    近期在项目中遇到这样一问题,关于jsonp跨域问题,get传值是可以的,但post传值死活不行啊,于是网上看了一大堆关于这方面的资料,最终问题得以解决,今天抽空与大家分享下. 说明:http://ww ...

  8. ajax使用jsonp解决跨域问题

    发现这几篇博客写的不错,转载过来看: js跨域及解决方案   http://www.cnblogs.com/oneword/archive/2012/12/03/2799443.html 如何解决aj ...

  9. 深入了解jsonp解决跨域访问

    在这个项目中,我们做的充分利用jsonp这是一个特点跨界,完成简单的单点登录认证和权限控制的统一.道,各有各的优点.各有各的优点,选择什么方式实现全然取决于我们自己或者项目经理的开发经验,对各种框架的 ...

随机推荐

  1. css系列(4)简介

        本节用来简单介绍css.     (1)css: CSS 指层叠样式表 (Cascading Style Sheets): 功能以及作用:1.样式定义如何显示 HTML 元素; 2.样式通常存 ...

  2. flex for循环

    //for ..in 循环中的迭代变量包含属性所保存的值和名称 //for each..in 循环中的迭代变量只包含属性所保存的值,而不包含属性的名称 //对象遍历,可以获取属性名称 private ...

  3. Springboot文件下载

    https://blog.csdn.net/stubbornness1219/article/details/72356632 Springboot对资源的描述提供了相应的接口,其主要实现类有Clas ...

  4. <script>放在head内和body内有什么区别

    加载的顺序不一样,你可以把HTML看成从上往下加载的. 例如在网速慢的情况下把js代码放在body底部用户会先看到网页结构,等js加载完成后才出现特效 区别简述: 在HTML body部分中的Java ...

  5. $.queue() 与 $.dequeue() -- 队列

    JQuery 运用队列为动画模块服务,但好像它应该有更多用处,我觉得的,那试试就知道咯. 简单的来讲,它就是形成队列和出列, 也就因此可以进行很有规律的回调和延时了呀(暂停感觉有难度),当然这就是后面 ...

  6. Python编程-函数进阶二

    一.生成器补充 1.什么是生成器? 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象. 2.生成器分类 (1) ...

  7. 斯坦福机器学习视频笔记 Week8 无监督学习:聚类与数据降维 Clusting & Dimensionality Reduction

    监督学习算法需要标记的样本(x,y),但是无监督学习算法只需要input(x). 您将了解聚类 - 用于市场分割,文本摘要,以及许多其他应用程序. Principal Components Analy ...

  8. Django object filter查询[转]

    用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如object.filter(tag__contains='keywords').... 在这种情况下,如果你跟踪 ...

  9. XXL-Job分布式任务调度

    分布式情况下定时任务会出现哪些问题? 分布式集群的情况下,怎么保证定时任务不被重复执行 分布式定时任务解决方案 ①使用zookeeper实现分布式锁 缺点(需要创建临时节点.和事件通知不易于扩展) ② ...

  10. ZigzagConvert

    public class ZigzagConvert { public static String convert(String s, int nRows) { int len = s.length( ...