项目(打下广告,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 {
-
-
String jsonData = getDataAsJson(req.getParameter("symbol"
));
-
-
String callback = req.getParameter("callback"
);
-
-
String output = callback + "("
+ jsonData + ");
-
resp.setContentType("text/javascript"
);
-
PrintWriter out = resp.getWriter();
-
out.println(output);
-
-
}
假设这个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已经为我们做了很多
分享到:
相关推荐
2. **支持GET请求**:JSONP仅限于GET请求,但GET请求在很多场景下已经足够。 #### 局限性 1. **只支持GET**:由于JSONP基于`<script>`标签,所以无法发起POST、PUT等其他类型的HTTP请求。 2. **无状态**:JSONP不...
然而,Ajax技术在实现动态网页交互时常常需要跨越这个限制,这时就引入了JSONP(JSON with Padding)作为跨域请求的一种解决方案。本文将详细介绍JSONP的工作原理以及如何在ASP.NET网站开发中应用JSONP解决Ajax跨域...
总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更安全,但需要服务器端的配合。在实际开发中,根据项目需求和浏览器兼容性选择...
总结,JSONP是一种简单且广泛使用的跨域解决方案,尤其适用于那些不支持CORS的旧版本浏览器。然而,考虑到安全性和灵活性,CORS在现代Web开发中已成为更推荐的选择。理解JSONP的工作原理和使用方法对于任何Web开发者...
JSONP(JSON with Padding)是一种解决跨域问题的非标准方法,主要用于JSON数据的获取。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSONP的核心思想是利用`<script>`标签的src...
基于ajax方式的跨域请求jsonp的前后台代码
JSONP(JSON with Padding)是一种解决跨域请求的方法,即在客户端通过 script 标签请求服务器端的数据,然后服务器端将数据以 JSON 格式返回,并在返回数据中包含一个回调函数,以便客户端可以将数据处理。...
JsonP 是一种解决跨域请求的技术,它可以跨域请求数据,解决了 JavaScript 的跨域问题。JsonP 的优点是可以跨域请求数据,减少服务器的负载,但是它也存在安全问题和服务器端实现的限制。JsonP 的使用场景非常广泛,...
"跨域请求解决方案源代码(JSONP, CORS)"这个主题主要关注如何绕过同源策略,实现跨域数据交互。以下是对这两个常见跨域解决方案的详细解释: **JSONP(JSON with Padding)** JSONP是一种早期的跨域数据交互方式...
### 跨域请求资源——JSONP与CORS的区别 #### 一、跨域的基本概念 在Web开发中,“跨域”是指从一个域名发起请求到另一个域名。这主要是因为浏览器出于安全考虑实施了**同源策略**(Same-Origin Policy)。同源...
2. **回调函数**:JSONP的核心在于定义一个全局函数,这个函数会在`<script>`标签加载并执行返回的JavaScript代码时被调用。函数名由客户端指定,并作为参数传递给服务器。 3. **服务器响应**:服务器接收到请求后...
**Ajax跨域请求问题与jQuery JSONP解析** 在Web开发中,Ajax技术被广泛用于实现页面的异步更新,但浏览器的同源策略(Same-Origin Policy)限制了Ajax请求只能向同源(协议、域名、端口均相同)的服务器发送。这在...
跨域资源共享CORS(Cross-origin Resource Sharing),是W3C的一个标准,允许浏览器向跨源的服务器发起XMLHttpRequest请求,克服ajax请求只能同源使用的限制。关于CORS的详细解读,可参考阮一峰大神的博客:跨域资源...
JSONP是早期解决跨域问题的手段,适用于只支持GET请求的情况。它的原理是利用HTML的`<script>`标签不受同源策略限制的特性,通过动态创建`<script>`标签来加载服务器返回的JavaScript代码,这个代码通常是一个函数...
在实际开发中,当WebApi作为一个独立的服务,例如数据服务层,而MVC项目作为前端展示层时,两者位于不同的项目和端口下,浏览器会阻止MVC对WebApi的跨域请求,导致数据无法正常获取。 为了解决这个问题,我们可以...
总结来说,JSONP是一种解决跨域问题的技术,通过将数据封装在JavaScript函数调用中,使得前端能够跨越同源策略的限制获取到服务端的数据。在C# Web Service中实现JSONP,需要创建支持回调的Web方法并设置适当的响应...
标题中的“java版 解决跨域问题CORS ajax...通过阅读和分析这些源代码和讨论,开发者可以更好地理解如何在实际项目中处理跨域问题,并学习如何处理相关技术的细节,如JSONP只支持GET请求的限制以及可能出现的编码问题。
使用 JSONP 完成 HTTP 和 HTTPS 之间的跨域访问 知识点一: 什么是 JSONP ...通过了解 JSONP 的工作原理、使用场景、优点和缺点,我们可以更好地使用 JSONP 实现跨域访问,提高应用程序的安全性和性能。
SignalR 分:PersistentConnection和Hub 2种模式。跨域又分:UseCors和JsonP 2种方法 所以例子写了4种。介绍:http://www.cnblogs.com/shikyoh/p/6272679.html
JSONP(JSON with Padding)是一种解决浏览器同源策略限制的跨域数据交互协议。它允许JavaScript从不同的域名(跨域)获取数据,这是通过动态创建`<script>`标签实现的,因为浏览器允许从不同源加载JavaScript文件。...