`
hongtoushizi
  • 浏览: 376931 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多
 
上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式:JSONP和CORS。
  那这篇博客就介绍JSONP方式。
  JSONP原理
  在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img、iframe、script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据。
  而JSONP就是通过script节点src调用跨域的请求。
  当我们通过JSONP模式请求跨域资源时,服务器返回给客户端一段javascript代码,这段javascript代码自动调用客户端回调函数。
  举个例子
  客户端http://localhost:8080访问服务器http://localhost:11111/user,正常情况下,这是不允许的。因为这两个URL是不同域的。
  
  若我们使用JSONP格式发送请求的话?
  http://localhost:11111/user?callback=callbackfunction
  则服务器返回的数据如下:
  callbackfunction({"id":1,"name":"test"})
  仔细看看服务器返回的数据,其实就是一段javascript代码,这就是函数名(参数)格式。
  服务器返回后,则自动执行callbackfunction函数。
  因此,客户端需要callbackfunction函数,以便使用JSONP模式返回javascript代码后自动执行其回调函数。
 
  注意:其中url地址中的callback和callbackfunction是随意命名的。
  
  具体的JS实现JSONP代码。
  JS中:
   
  1.   <script>  
  2.   var url = "http://localhost:8080/crcp/rcp/t99eidt/testjson.do?jsonp=callbackfunction";   
  3.   var script = document.createElement('script');   
  4.   script.setAttribute('src', url);  //load javascript    
  5.   document.getElementsByTagName('head')[0].appendChild(script);   
  6.   
  7.   //回调函数  
  8.    function callbackfunction(data){  
  9. var html=JSON.stringify(data.RESULTSET);  
  10. alert(html);  
  11.      }  
  12.   </script>  
  
  服务器代码Action:
  后台返回的json外面需要由回调函数包裹。具体的方法如下:
  
  1. public class TestJson extends ActionSupport{  
  2.   
  3.     @Override  
  4.     public String execute() throws Exception {  
  5.         try {  
  6.             JSONObject jsonObject=new JSONObject();  
  7.             List list=new ArrayList();  
  8.             for(int i=0;i<4;i++){  
  9.                 Map paramMap=new HashMap();  
  10.                 paramMap.put("bank_no", 100+i);  
  11.                 paramMap.put("money_type", i);  
  12.                 paramMap.put("bank_name", i);  
  13.                 paramMap.put("bank_type", i);  
  14.                 paramMap.put("bank_status", 0);  
  15.                 paramMap.put("en_sign_ways", 1);  
  16.                 list.add(paramMap);  
  17.             }  
  18.             JSONArray rows=JSONArray.fromObject(list);  
  19.             jsonObject.put("RESULTSET", rows);  
  20.             HttpServletRequest request=ServletActionContext.getRequest();  
  21.             HttpServletResponse response=ServletActionContext.getResponse();  
  22.             response.setContentType("text/javascript");  
  23.               
  24.               
  25.             boolean jsonP = false;  
  26.             String cb = request.getParameter("jsonp");  
  27.             if (cb != null) {  
  28.                 jsonP = true;  
  29.                 System.out.println("jsonp");  
  30.                 response.setContentType("text/javascript");  
  31.             } else {  
  32.                 System.out.println("json");  
  33.                 response.setContentType("application/x-json");  
  34.             }  
  35.             response.setCharacterEncoding("UTF-8");  
  36.             Writer out = response.getWriter();  
  37.             if (jsonP) {  
  38.                 out.write(cb + "("+jsonObject.toString()+")");  
  39.                 System.out.println(jsonObject.toString());  
  40.             }  
  41.             else{  
  42.                 out.write(jsonObject.toString());  
  43.                  System.out.println(jsonObject.toString());  
  44.             }  
  45.         } catch (Exception e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.          
  49.         return null;  
  50.     }  
  51. }  
 
 JQUERY实现JSONP代码。
 Jquery从1.2版本开始也支持JSONP的实现。
  1. $(function(){  
  2.      jQuery.getJSON("http://localhost:8080/crcp/rcp/t99eidt/testjson.do?jsonp=?",function(data)  
  3. {   
  4.   var html=JSON.stringify(data.RESULTSET);  
  5. $("#testjsonp").html(html);  
  6. }  
  7.      );   
  8. });  
  第一个?代表后面是参数,与咱们一般调用一样。重要的是第二个?,则是jquery动态给你生成毁掉函数名称。
至于后台代码和上述一致,使用同一个后台。
 
JQUERY中Ajax实现JSONP代码。
  1.  $.ajax({  
  2. type:"GET",  
  3. async :false,  
  4. url:"http://localhost:8080/crcp/rcp/t99eidt/testjson.do",  
  5. dataType:"jsonp",  
  6. success:function(data){  
  7. var html=JSON.stringify(data.RESULTSET);  
  8. $("#testjsonp").html(html);  
  9. },  
  10. error:function(){  
  11. alert("error");  
  12. }  
  13.   
  14. });  
    注意:这种形式,默认的参数是callback,而不是会是其他。则action代码中获取calback值则
    String cb=request.getParameter("callback");
    并且生成的回调函数,默认也是类似上述一大串数字。
    根据Ajax手册,更改callback名称以及回调函数名称。
    http://www.w3school.com.cn/jquery/ajax_ajax.asp 
    jsonpCallback:callbackfunction,则请求的地址为:
    最后返回前台的是:
    callbackfunction(具体的json值)
 
    其中上述JS实现JSONP代码中,若不是动态拼接script脚本,而是直接写script标签,类似如下:
   <script type="text/javascript" src=""></script>
   若这样写的话,通过debug发现,的确正确返回了,但是一直提示找不到回调函数。即使js也提供了回调函数【各个浏览器都测试】
   若要通过JS来显示,则通过代码动态create script标签。
 
   JSONP跨域方式,很方便,同时也支持大多部分浏览器,但是唯一缺点是,只支持GET提交方式,不支持其他POST提交。
   若url地址传输的参数过多,如何实现呢?下篇博客会讲解另一种跨域方案CROS原理以及具体调用示例。

版权声明:本文为博主原创文章,未经博主允许不得转载

分享到:
评论

相关推荐

    跨域jsonp资料包.zip

    在"跨域jsonp资料包"中,可能包含详细的JSONP实例、示例代码、实战教程等内容,可以帮助开发者深入理解和应用JSONP。通过学习这个资料包,你可以更好地掌握JSONP的使用技巧,解决实际开发中的跨域问题。

    jquery跨域调用 js跨域调用

    四、jQuery跨域调用示例 ```javascript // JSONP 示例 $.ajax({ url: 'http://example.com/data?callback=?', type: 'GET', dataType: 'jsonp', success: function(data) { console.log(data); } }); // CORS...

    跨域访问解决方法-jsonp

    本文将详细探讨JSONP的工作原理以及如何在实际项目中使用它来跨域获取JSON数据。 ### JSONP简介 JSONP全称为"JSON Padding",它并不是JSON的一种新格式,而是一种利用动态创建`&lt;script&gt;`标签来绕过同源策略的技巧...

    跨域访问禁止以及使用JSONP实现跨域的示例

    JSONP是一种绕过同源策略的方法,其原理是利用`&lt;script&gt;`标签可以跨域加载资源的特性。JSONP的工作流程如下: 1. 客户端(浏览器)创建一个`&lt;script&gt;`元素,并设置其`src`属性为服务端的URL,该URL通常包含一个回调...

    jsonp json ajax跨域调用

    JSONP的工作原理是利用`&lt;script&gt;`标签不受同源策略限制的特点,通过动态创建并插入一个`&lt;script&gt;`标签来发起请求,然后服务器返回一个包含回调函数的JavaScript代码片段。 **JSONP的产生背景**主要是为了解决跨域...

    jsonp跨域请求

    JSONP(JSON with Padding)是一种常见的解决JavaScript跨域问题的技术。由于浏览器的同源策略限制,JavaScript通常不能向不同源的服务器...了解和掌握JSONP有助于理解跨域请求的原理,为解决实际问题提供更多的选择。

    JSONP原理以及示例.rar

    JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了HTML中`&lt;script&gt;`标签可以不受同源策略限制的特性,实现浏览器与服务器之间的数据通信。在Web开发中,由于同源策略的限制,JavaScript通常无法直接访问...

    jsonp跨域请求实现示例

    通过上述的实现原理和示例代码,我们可以看到JSONP是一种相对简单且高效的跨域请求解决方案,特别适用于那些不能修改CORS配置的老旧API接口。然而,随着现代浏览器对CORS的支持越来越好,开发者们更倾向于使用CORS来...

    JS跨域调用Window服务代码示例

    然而,为了实现特定功能,如跨域调用Window服务来获取本机硬件信息,我们需要采用一些特殊的技术来规避这种限制。本文将详细介绍如何使用JS进行跨域调用,特别是结合WCF(Windows Communication Foundation)技术和...

    jsonp跨域解决源代码

    2. JSONP原理:JSONP的基本思想是,服务器提供一个可以接受参数的JavaScript函数名,客户端在请求时传递这个函数名,服务器返回一个调用该函数并带有JSON数据的脚本,`&lt;script&gt;`标签加载这个脚本,从而实现跨域数据...

    Ajax跨域请求解决方案-JSONP

    本文将详细介绍JSONP的工作原理以及如何在ASP.NET网站开发中应用JSONP解决Ajax跨域问题。 首先,理解JSONP的基本概念。JSONP是一种非官方的数据交换格式,它的核心思想是利用HTML中的`&lt;script&gt;`标签不受同源策略...

    Jsonp 跨域的原理以及Jquery的解决方案

    在给定的示例代码中,客户端定义了一个名为jsonpCallback的函数,当从服务器获取数据后,会执行这个函数,并将返回的JSON数据作为参数传递给该函数,实现了数据的跨域访问。 在Jquery中,为了简化JSONP请求的编写,...

    ASPNET_JSONP_demo(jq跨域)

    本示例“ASPNET_JSONP_demo(jq跨域)”正是展示了如何在 ASP.NET 平台上构建一个 JSONP 服务,并利用 jQuery 进行跨域调用。 首先,我们需要理解 JSONP 的工作原理。JSONP 是通过动态创建 `&lt;script&gt;` 标签来请求数据...

    jsonp 简单示例

    通过分析这个示例,开发者可以理解JSONP的工作原理,并将其应用到实际的项目中,解决跨域数据交互的问题。尽管现代Web开发中有了CORS(Cross-Origin Resource Sharing)这样的更安全的跨域解决方案,但在某些情况下...

    Jquery跨域Ajax请求测试

    JSONP(JSON with Padding)是一种规避同源策略的方法,它通过动态创建 `&lt;script&gt;` 标签来加载服务端返回的JavaScript代码,该代码会调用一个预先定义好的回调函数并传递数据。 以下是一个简单的jQuery跨域Ajax请求...

    利用jsonp跨域调用百度js实现搜索框智能提示

    【JSONP跨域调用与百度搜索框智能提示】 在Web开发中,由于浏览器的同源策略限制,JavaScript无法直接发起跨域请求。为了解决这个问题,JSONP(JSON with Padding)应运而生。JSONP是一种绕过同源策略的技术,通过...

    jsonpajax跨域请求

    "jsonp跨域请求"可能是服务器返回的示例数据,模拟了JSONP的跨域请求过程。 总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更...

    jsonp示例2则

    在本示例中,我们将深入探讨JSONP的工作原理,以及如何使用Python来实现JSONP服务。 **JSONP的原理** JSONP的核心思想是通过动态插入`&lt;script&gt;`标签,其`src`属性指向提供数据的服务端URL。服务端返回的不是标准的...

    JS 使用 JSONP 跨域获取用户IP

    在标题“JS 使用 JSONP 跨域获取用户IP”中,我们可以理解为这个示例将展示如何利用JSONP技术来解决浏览器的同源策略限制,从而获取到用户的IP地址。这在某些场景下非常有用,比如分析用户地理位置、提供个性化服务...

Global site tag (gtag.js) - Google Analytics