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

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

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

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

1、Web2.0的趋势

内容的聚合,mashup
2、浏览器的限制

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

3、解决方法

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

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

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

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取JSON数据
String jsonData = getDataAsJson(req.getParameter("symbol"));
//获取回调函数名
String callback = req.getParameter("callback");
//拼接动态JS代码
String output = callback + "(" + jsonData + ");
resp.setContentType("text/javascript");
PrintWriter out = resp.getWriter();	
out.println(output);	
// 输出为 jsonpFunc({"symbol" : "IBM", "price" : "91.42"});
}


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

<script type="text/javascript" 
src="http://www.google.com/jsonp&company=IBM&callback=callback"></script>

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

但实际的开发中,JS库中一般都包含了更便于使用的JSONP方法,例如jquery和kissy。
以jquery为例,jsonp的调用形式如下
jQuery.getJSON(
"http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=?", 
function(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
);


其中回调函数名”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已经为我们做了很多
6、参考文档

http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/index.html
分享到:
评论

相关推荐

    Jquery跨域Json请求处理

    本文主要讨论的是通过JQuery实现跨域请求JSON数据的方式——JSONP。 #### 三、JSONP原理及使用 **JSONP**是一种绕过同源策略的技术,它利用了`&lt;script&gt;`标签不受同源策略限制的特点。当使用JSONP进行跨域请求时,...

    JS跨域请求解决方案.docx

    ### JS跨域请求解决方案 #### 一、理解跨域与同源策略 **跨域**在Web开发中指的是从一个域名发起对另一个域名资源的请求。这种请求涉及到多个域名之间的数据交互,通常会受到浏览器安全策略——**同源策略**(Same...

    WEB前端关于跨域问题的8种解决方案

    6. **代理服务器**:在前端与目标服务器之间设置一个代理服务器,所有跨域请求都通过代理转发,这样请求的实际源就会与代理服务器同源,从而规避同源策略。 7. **WebSocket**:WebSocket是一种持久化的双向通信协议...

    Ajax跨域问题及其解决方案.docx

    而对于非简单请求(如PUT、DELETE等),浏览器会在发送真正请求之前先发送一个预检请求(OPTIONS请求),以确认服务器是否允许该跨域请求。预检请求的成功响应将被缓存一定时间,以减少后续请求时不必要的预检步骤,...

    前端基础-Ajax跨域问题的解决方案.docx

    总结,前端开发中遇到跨域问题时,可以依据项目需求和服务器支持选择 JSONP 或 CORS 解决。JSONP 适用于简单的数据交互,不需要服务器端修改即可实现,但不支持 POST 请求和自定义头部。CORS 提供了更全面的跨域解决...

    跨域解决方案整理笔记.docx

    跨域解决方案是对Web开发中遇到的一个重要问题的回应,源于浏览器的安全策略——同源策略。同源策略限制了从一个域名、协议或端口访问另一个域名、协议或端口的资源,以保护用户数据不被恶意网站窃取。在开发过程中...

    WebUploadTest(跨域)

    5. JSONP(JSON with Padding):在不支持CORS的旧版本浏览器中,开发者可能会使用JSONP来实现跨域请求。JSONP通过动态插入`&lt;script&gt;`标签来实现跨域,但仅限于GET请求,且没有错误处理机制。 6. CORS预检请求...

    跨域有几种解决方式?原理是什么?跨域.docx

    由于同源策略的存在,直接通过前端代码发起跨域请求通常会受到限制,导致请求失败。这不仅影响数据的正常获取,还可能阻碍项目的正常开发流程。 #### 三、跨域解决方案 针对跨域问题,有多种解决方案,每种方法都...

    普元eos跨域组件

    综上所述,普元EOS跨域组件为开发者提供了一种有效的解决跨域问题的方案,通过JSONP和CORS技术,让前端和后端在不同源之间能够顺利通信,提升了Web应用的用户体验和开发效率。在使用过程中,我们不仅要关注其实现...

    跨域demo.rar

    - **前端跨域配置**:在React、Vue、Angular等前端框架中,可以使用axios等库,配置跨域请求。 6. **注意事项** - 跨域策略是浏览器的实现,而非HTTP协议规定,因此只在浏览器环境中存在。 - 跨域请求不会触发...

    SpringMVC的跨域解决方案.docx

    3. **AJAX请求**:前端需要使用JSONP方式进行请求,并指定回调函数名。 ```javascript $.ajax({ type: "get", async: false, dataType: 'jsonp', url: 'http://sso.isy.cn/login.json', data: $("#loginForm...

    跨域解决方案Jsonp原理解析

    jsonp: 'callBack', // 指定回调函数名参数 success: function(data) { // 返回结果处理程序 } }); ``` 在后端,我们需要根据前端传入的`callBack`参数来构造响应,将数据包裹在回调函数中返回: ```java @...

    ajax跨域,这应该是最全的解决方案了.docx

    JSONP(JSON with Padding)是一种实现跨域请求的方式,适用于GET请求。其原理是在客户端动态创建一个`&lt;script&gt;`标签,并将目标服务器提供的URL作为`src`属性。由于`&lt;script&gt;`标签不受同源策略限制,可以加载任何...

    基于vue-resource jsonp跨域问题的解决方法

    随着前端框架的不断发展,Vue.js作为其中之一,其资源请求插件vue-resource在处理跨域请求时,特别是json数据的请求,常常需要使用JSONP(JSON with Padding)技术。 JSONP的原理是利用了script标签不受同源策略...

    跨域的原因以及解决方案.docx

    了解跨域问题产生的原因及其解决方法对于前端开发者而言至关重要。 ##### 1.1 浏览器的同源策略 浏览器为了保护用户的隐私安全,防止恶意脚本攻击,实现了一套安全策略——同源策略(Same-Origin Policy)。这一...

    jsonp跨域获取数据的基础教程

    跨域请求数据就是在这种背景下产生的需求,而JSONP(JSON with Padding)是一种解决跨域请求数据问题的古老技术,本篇基础教程会深入讲解JSONP的原理以及如何实现JSONP跨域获取数据。 首先,JSONP的核心在于利用了`...

    django解决跨域请求的问题

    在今天的互联网开发中,前端与后端分离的模式变得越来越普遍,而这种模式下跨域请求问题是一个常见又不得不解决的问题。跨域资源共享(Cross-Origin Resource Sharing,CORS)是一种浏览器安全策略,它允许一个域的...

    测试跨域.7z

    标题中的“测试跨域”指的是检查前端应用程序是否能够成功地进行跨域请求。 描述中提到的测试方法是通过修改请求地址,运行页面后观察浏览器的开发者工具(F12)中的控制台,查看是否有错误信息。如果没有错误且...

    10种跨域解决方案.docx

    这类请求会在实际请求之前发送一个预检请求(即OPTIONS方法),以确认服务器是否允许该跨域请求。 **浏览器支持情况** 对于较旧版本的浏览器如IE , Opera , Firefox 等,CORS可能不被支持,这时可以考虑使用JSONP作为...

Global site tag (gtag.js) - Google Analytics