`
宋双旺
  • 浏览: 156928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习总结:前端跨域请求的解决办法——JSONP(很好)

    博客分类:
  • Ajax
阅读更多

项目(打下广告,http://xin.taobao.com )当中碰到一个需求,涉及到前端跨域请求的问题,印象中有一种方法叫jsonp,之前听过但没有详细了解过,趁任务不多看了几篇相关的文档学习了一下,并做了下总结。

附件里包含了这篇文章的文档和两个可用实例。

1、Web2.0的趋势


内容的聚合,mashup

2、浏览器的限制


由于受到浏览器的限制,Ajax不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数据驻留的远程服务器并且每个请求都前 往同一域,就可以避免这些安全错误。但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办?
说了那么多,根本意思就是通过ajax的形式去调用其他网站的接口是不行的。
例如:

Js代码  收藏代码
  1. $.ajax({  
  2.   url: "http://www.google.com/search?q=jquery" ,  
  3.   success: function (json){  
  4.     alert(json.count)  
  5.   }  
  6. });  

 

3、解决方法


为了在页面当中整合第三方服务器的数据,有那么几种方法:
1.克服该限制的一个相对简单的方法是让 Web 页面向它源自的 Web 服务器请求数据,并且让 Web 服务器像代理一样将请求转发给真正的第三方服务器。尽管该技术获得了普遍使用,但它是不可伸缩的。
我的理解:在后台代码中实现对第三方服务器的请求(API调用之类的),因为后台代码不受跨域限制。对其中所说的“不可伸缩”不太理解
2.另一种方式是使用框架要素在当前 Web 页面中创建新区域,并且使用 GET 请求获取任何第三方资源。不过,获取资源后,框架中的内容会受到同源策略的限制。
我的理解:就是使用iframe嵌套页面,但嵌套的页面同样会受到跨域的限制
3.第三种方法就是“JSONP”,全称是“JSON with Padding”,padding的中文意思是“填充”,之后我们会明白“填充”的意义。

4. JSONP原理


JSONP需要完成的任务包括两个方面:
 获取第三方服务器上的数据;
 通过本地的JS代码对第三方的数据进行处理和渲染

浏览器虽然限制了Ajax的跨域通信,但允许在页面中插入动态的脚本元素。简单的讲就是从第三方服务器加载js代码是可行的,例如:

Html代码  收藏代码
  1. < script   type = "text/javascript"   src = "http://www.google.com/test.js" > </ script >   


注释:但加载的js代码同样被视作是从当前域加载的,所以想在第三方的js代码中进行对第三方服务器的ajax调用同样是不行的。

所以可以通过第三方服务器生成动态的js代码来回调本地的js方法,而方法中的参数则由第三方服务器在后台获取,并以JSON的形式填充到JS方法当中,这也就是“JSON with Padding”中“padding”的真正意义。

应用过程当中,请求方(本地)向第三方服务器请求动态JS脚本,并将获取数据后需要回调的函数名以约定好的参数名(如callback等)发送给第三方服务器。

第三方服务器需要为JSONP请求开发相应的API,API中先获取JSONP请求需要的数据,然后以JSON的形式封装,再与请求方的回调函数名拼接在一起,动态生成请求方需要调用的JS代码。
用 Java servlet 实现的 JSONP 服务示例代码如下:

Java代码  收藏代码
  1. protected   void  doGet(HttpServletRequest req, HttpServletResponse resp)  throws  ServletException, IOException {  
  2. //获取JSON数据   
  3. String jsonData = getDataAsJson(req.getParameter("symbol" ));  
  4. //获取回调函数名   
  5. String callback = req.getParameter("callback" );  
  6. //拼接动态JS代码   
  7. String output = callback + "("  + jsonData + ");  
  8. resp.setContentType("text/javascript" );  
  9. PrintWriter out = resp.getWriter();   
  10. out.println(output);      
  11. // 输出为 jsonpFunc({"symbol" : "IBM", "price" : "91.42"});   
  12. }  



假设这个JSONP服务的URL为http://www.google.com/jsonp,回调的函数名为jsonpFunc,那么可以这样发送JSONP请求:

Html代码  收藏代码
  1. < script   type = "text/javascript"    
  2. src = "http://www.google.com/jsonp&company=IBM&callback=callback" > </ script >   


其中的company=IBM为查询数据所需要传递的参数
可用的实例见附件:jsonp.html

但实际的开发中,JS库中一般都包含了更便于使用的JSONP方法,例如jquery和kissy。
以jquery为例,jsonp的调用形式如下

Js代码  收藏代码
  1. jQuery.getJSON(  
  2. "http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=?" ,   
  3. function (data) {  
  4.     alert("Symbol: "  + data.symbol +  ", Price: "  + data.price);  
  5. }  
  6. );  



其中回调函数名”callback”为”?”,即不需要用户指定,而是由jquery生成,互调函数也不需要单独定义,而是以参数的形式紧接在URL之后,URL中还可以附带供数据查询用的其他参数,如上例中的”symbol=IBM”

淘宝的前端JS库貌似是KISSY,附上KISSY中JSONP方法的文档地址:http://docs.kissyui.com/kissy/docs/ajax/index.html#method_jsonp

可用的实例见附件:jquery_jsonp.html

两个实例中请求的JSONP服务的URL均为:
http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US &callback=?
可以把callback参数先去掉,在浏览器中看一下返回的json数据。

5、总结


1、 跨域的ajax请求无法实现
2、 浏览器允许动态js脚本注入
3、 JSONP服务需要第三方提供相应的JSONP服务
4、 Jquery和kissy已经为我们做了很多

分享到:
评论

相关推荐

    学习总结:前端跨域请求的解决办法——JSONP

    2. **支持GET请求**:JSONP仅限于GET请求,但GET请求在很多场景下已经足够。 #### 局限性 1. **只支持GET**:由于JSONP基于`&lt;script&gt;`标签,所以无法发起POST、PUT等其他类型的HTTP请求。 2. **无状态**:JSONP不...

    Ajax跨域请求解决方案-JSONP

    然而,Ajax技术在实现动态网页交互时常常需要跨越这个限制,这时就引入了JSONP(JSON with Padding)作为跨域请求的一种解决方案。本文将详细介绍JSONP的工作原理以及如何在ASP.NET网站开发中应用JSONP解决Ajax跨域...

    jsonpajax跨域请求

    总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更安全,但需要服务器端的配合。在实际开发中,根据项目需求和浏览器兼容性选择...

    跨域访问解决方法-jsonp

    总结,JSONP是一种简单且广泛使用的跨域解决方案,尤其适用于那些不支持CORS的旧版本浏览器。然而,考虑到安全性和灵活性,CORS在现代Web开发中已成为更推荐的选择。理解JSONP的工作原理和使用方法对于任何Web开发者...

    html通过 ajax jsonp跨域请求接收和传送数据

    JSONP(JSON with Padding)是一种解决跨域问题的非标准方法,主要用于JSON数据的获取。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSONP的核心思想是利用`&lt;script&gt;`标签的src...

    ajax跨域请求jsonp前后台代码

    基于ajax方式的跨域请求jsonp的前后台代码

    PHP AJAX JSONP实现跨域请求使用范例_ajax如何解决跨域请求

    JSONP(JSON with Padding)是一种解决跨域请求的方法,即在客户端通过 script 标签请求服务器端的数据,然后服务器端将数据以 JSON 格式返回,并在返回数据中包含一个回调函数,以便客户端可以将数据处理。...

    jsonp解决跨域.docx

    JsonP 是一种解决跨域请求的技术,它可以跨域请求数据,解决了 JavaScript 的跨域问题。JsonP 的优点是可以跨域请求数据,减少服务器的负载,但是它也存在安全问题和服务器端实现的限制。JsonP 的使用场景非常广泛,...

    跨域请求解决方案源代码(JSONP,CORS)

    "跨域请求解决方案源代码(JSONP, CORS)"这个主题主要关注如何绕过同源策略,实现跨域数据交互。以下是对这两个常见跨域解决方案的详细解释: **JSONP(JSON with Padding)** JSONP是一种早期的跨域数据交互方式...

    跨域请求资源-jsonp和cors区别.pdf

    ### 跨域请求资源——JSONP与CORS的区别 #### 一、跨域的基本概念 在Web开发中,“跨域”是指从一个域名发起请求到另一个域名。这主要是因为浏览器出于安全考虑实施了**同源策略**(Same-Origin Policy)。同源...

    jsonp跨域请求

    2. **回调函数**:JSONP的核心在于定义一个全局函数,这个函数会在`&lt;script&gt;`标签加载并执行返回的JavaScript代码时被调用。函数名由客户端指定,并作为参数传递给服务器。 3. **服务器响应**:服务器接收到请求后...

    ajax 跨域请求问题 jquery jsonp

    **Ajax跨域请求问题与jQuery JSONP解析** 在Web开发中,Ajax技术被广泛用于实现页面的异步更新,但浏览器的同源策略(Same-Origin Policy)限制了Ajax请求只能向同源(协议、域名、端口均相同)的服务器发送。这在...

    vue+springboot实现项目的CORS跨域请求

    跨域资源共享CORS(Cross-origin Resource Sharing),是W3C的一个标准,允许浏览器向跨源的服务器发起XMLHttpRequest请求,克服ajax请求只能同源使用的限制。关于CORS的详细解读,可参考阮一峰大神的博客:跨域资源...

    ajax跨域CORS方案 JSONP跨域请求方案.zip

    JSONP是早期解决跨域问题的手段,适用于只支持GET请求的情况。它的原理是利用HTML的`&lt;script&gt;`标签不受同源策略限制的特性,通过动态创建`&lt;script&gt;`标签来加载服务器返回的JavaScript代码,这个代码通常是一个函数...

    JSONP解决跨域问题

    总结来说,JSONP是一种解决跨域问题的技术,通过将数据封装在JavaScript函数调用中,使得前端能够跨越同源策略的限制获取到服务端的数据。在C# Web Service中实现JSONP,需要创建支持回调的Web方法并设置适当的响应...

    java版 解决跨域问题CORS ajax+jsonp例子源代码.zip

    标题中的“java版 解决跨域问题CORS ajax...通过阅读和分析这些源代码和讨论,开发者可以更好地理解如何在实际项目中处理跨域问题,并学习如何处理相关技术的细节,如JSONP只支持GET请求的限制以及可能出现的编码问题。

    使用JSONP完成HTTP和HTTPS之间的跨域访问

    使用 JSONP 完成 HTTP 和 HTTPS 之间的跨域访问 知识点一: 什么是 JSONP ...通过了解 JSONP 的工作原理、使用场景、优点和缺点,我们可以更好地使用 JSONP 实现跨域访问,提高应用程序的安全性和性能。

    PHP下ajax跨域的解决方案之jsonp实例分析.docx

    JSONP(JSON with Padding)是一种解决浏览器同源策略限制的跨域数据交互协议。它允许JavaScript从不同的域名(跨域)获取数据,这是通过动态创建`&lt;script&gt;`标签实现的,因为浏览器允许从不同源加载JavaScript文件。...

    前端后端+跨域请求+java/js

    本文将深入探讨前端与后端之间的通信、跨域请求的概念、原因以及解决策略,并通过Java和JavaScript(JS)的示例来讲解如何处理这些问题。 首先,前端通常指的是用户在浏览器中直接交互的部分,包括HTML、CSS和...

    解决跨域封装的jsonp.js文件

    解决跨域封装的jsonp

Global site tag (gtag.js) - Google Analytics