跨域JSONP原理及调用详细演示样例

上篇博客介绍了同源策略和跨域訪问概念,当中提到跨域经常使用的基本方式:JSONP和CORS。

那这篇博客就介绍JSONP方式。

JSONP原理

在同源策略下,在某个server下的页面是无法获取到该server以外的数据的,但img、iframe、script等标签是个例外。这些标签能够通过src属性请求到其它server上的数据。

而JSONP就是通过script节点src调用跨域的请求。

当我们通过JSONP模式请求跨域资源时,server返回给client一段javascript代码,这段javascript代码自己主动调用client回调函数。

举个样例

clienthttp://localhost:8080訪问serverhttp://localhost:11111/user。正常情况下,这是不同意的。

由于这两个URL是不同域的。

若我们使用JSONP格式发送请求的话?

http://localhost:11111/user?

callback=callbackfunction

则server返回的数据例如以下:

callbackfunction({"id":1,"name":"test"})

细致看看server返回的数据,事实上就是一段javascript代码。这就是函数名(參数)格式。

server返回后,则自己主动运行callbackfunction函数。

因此,client须要callbackfunction函数。以便使用JSONP模式返回javascript代码后自己主动运行其回调函数。

  注意:当中url地址中的callback和callbackfunction是任意命名的。

  

详细的JS实现JSONP代码。

JS中:

  <script>
  var url = "http://localhost:8080/crcp/rcp/t99eidt/testjson.do?

jsonp=callbackfunction";
  var script = document.createElement('script');
  script.setAttribute('src', url);  //load javascript
  document.getElementsByTagName('head')[0].appendChild(script); 

  //回调函数
   function callbackfunction(data){
var html=JSON.stringify(data.RESULTSET);
alert(html);
     }
  </script>

server代码Action:

后台返回的json外面须要由回调函数包裹。详细的方法例如以下:

public class TestJson extends ActionSupport{

	@Override
	public String execute() throws Exception {
		try {
			JSONObject jsonObject=new JSONObject();
			List list=new ArrayList();
			for(int i=0;i<4;i++){
				Map paramMap=new HashMap();
				paramMap.put("bank_no", 100+i);
				paramMap.put("money_type", i);
				paramMap.put("bank_name", i);
				paramMap.put("bank_type", i);
				paramMap.put("bank_status", 0);
				paramMap.put("en_sign_ways", 1);
				list.add(paramMap);
			}
			JSONArray rows=JSONArray.fromObject(list);
			jsonObject.put("RESULTSET", rows);
			HttpServletRequest request=ServletActionContext.getRequest();
			HttpServletResponse response=ServletActionContext.getResponse();
			response.setContentType("text/javascript");

			boolean jsonP = false;
			String cb = request.getParameter("jsonp");
			if (cb != null) {
			    jsonP = true;
			    System.out.println("jsonp");
			    response.setContentType("text/javascript");
			} else {
				System.out.println("json");
			    response.setContentType("application/x-json");
			}
			response.setCharacterEncoding("UTF-8");
			Writer out = response.getWriter();
			if (jsonP) {
			    out.write(cb + "("+jsonObject.toString()+")");
			    System.out.println(jsonObject.toString());
			}
			else{
				out.write(jsonObject.toString());
				 System.out.println(jsonObject.toString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
}

 JQUERY实现JSONP代码。

Jquery从1.2版本号開始也支持JSONP的实现。

$(function(){
     jQuery.getJSON("http://localhost:8080/crcp/rcp/t99eidt/testjson.do?jsonp=?",function(data)
{
  var html=JSON.stringify(data.RESULTSET);
$("#testjsonp").html(html);
}
     );
});

第一个?代表后面是參数,与咱们一般调用一样。重要的是第二个?。则是jquery动态给你生成毁掉函数名称。

至于后台代码和上述一致,使用同一个后台。

JQUERY中Ajax实现JSONP代码。

     $.ajax({
    type:"GET",
    async :false,
    url:"http://localhost:8080/crcp/rcp/t99eidt/testjson.do",
    dataType:"jsonp",
    success:function(data){
    var html=JSON.stringify(data.RESULTSET);
    $("#testjsonp").html(html);
    },
    error:function(){
    alert("error");
    }

    });

注意:这样的形式,默认的參数是callback,而不是会是其它。则action代码中获取calback值则

String cb=request.getParameter("callback");

而且生成的回调函数,默认也是类似上述一大串数字。

依据Ajax手冊。更改callback名称以及回调函数名称。

http://www.w3school.com.cn/jquery/ajax_ajax.asp

jsonp:jsonp,则请求的地址为:jsonp=%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E5%90%8D">http://localhost:8080/crcp/rcp/t99eidt/testjson.do?

jsonp=自己主动生成回调函数名

jsonpCallback:callbackfunction,则请求的地址为:

http://localhost:8080/crcp/rcp/t99eidt/testjson.do?

jsonp=callbackfunction

最后返回前台的是:

callbackfunction(详细的json值)

当中上述JS实现JSONP代码中。若不是动态拼接script脚本,而是直接写script标签。类似例如以下:

<script type="text/javascript" src=""></script>

若这样写的话,通过debug发现,的确正确返回了。可是一直提示找不到回调函数。即使js也提供了回调函数【各个浏览器都測试】

若要通过JS来显示。则通过代码动态create script标签。

JSONP跨域方式。非常方便,同一时候也支持大多部分浏览器,可是唯一缺点是,仅仅支持GET提交方式,不支持其它POST提交。

若url地址传输的參数过多,怎样实现呢?下篇博客会解说还有一种跨域方案CROS原理以及详细调用演示样例。

时间: 2024-11-10 07:02:32

跨域JSONP原理及调用详细演示样例的相关文章

跨域JSONP原理及调用具体示例

上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式:JSONP和CORS. 那这篇博客就介绍JSONP方式. JSONP原理 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据. 而JSONP就是通过script节点src调用跨域的请求. 当我们通过JSONP模式请求跨域资源时,服务器返回给客户端一段javascript代码,这段javascript代码自动调用客

跨域JSONP 获取内容

跨域JSONP原理及调用具体示例 分类: 小笔记 跨域 浏览器 JSONP CORS 2014-10-12 11:29 3221人阅读 评论(0) 收藏 举报 上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式:JSONP和CORS. 那这篇博客就介绍JSONP方式.  JSONP原理 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据. 而JSONP就是通过sc

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一訪问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制.

JSONP跨域的原理解析

JSONP跨域的原理解析 一种脚本注入行为 在 2011年10月27日 那天写的     已经有 99238 次阅读了 感谢 参考或原文 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进

【转】JSONP跨域的原理解析

JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进行多iframe或多窗口编程.以及Ajax编程时显得尤为重要.根据这个策略,在baidu.com下的页面中包含的JavaScript代码,不能访问在

jsonp跨域的原理

1. 前言 jsonp是一种常用的跨域手段,和反向代理,服务端做跨域处理相比,jsonp更显得方便轻巧,因而被大量用来处理跨域的请求,那么,这种请求方式到底是用了什么黑魔法,来解决令我们头疼的跨域问题. 2. 原理 jsonp其实并没有用到什么黑魔法,能达到跨域这种效果,无非是利用script标签自身的跨域能力.我们知道,img,script,这种标签如果有相应的src,那么便会发起一个htttp请求来请求相应的资源,如果有script标签对应的路径是一个js文件,那么在下载完毕这个js之后会马

JSONP跨域的原理解析及其实现介绍

JSONP 即 Json padding ,JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并且探讨下JSONP跨域的原理 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档 在同一域下的内容. JavaScr

.net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器

1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.WebForm使用母版页进行登录时候的验证 //新建一个页面父类 public abstract class BasePage:Page { protected void Page_Load(object sender, EventArgs e) { //1.身份验证的方法 Session if (Se

JSONP跨域的原理解析( 一种脚本注入行为)

JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于JavaScript代码能够访问的页面内容作了很重要的限制, 即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进行多Iframe或多窗口编程.以及Ajax编程时显得尤为重要.根据这个策略,在baidu.com 下的页面中包含的JavaScript的代码,不