上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式: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中:
- <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>
服务器代码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,则请求的地址为: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原理以及具体调用示例。
版权声明:本文为博主原创文章,未经博主允许不得转载
相关推荐
在"跨域jsonp资料包"中,可能包含详细的JSONP实例、示例代码、实战教程等内容,可以帮助开发者深入理解和应用JSONP。通过学习这个资料包,你可以更好地掌握JSONP的使用技巧,解决实际开发中的跨域问题。
四、jQuery跨域调用示例 ```javascript // JSONP 示例 $.ajax({ url: 'http://example.com/data?callback=?', type: 'GET', dataType: 'jsonp', success: function(data) { console.log(data); } }); // CORS...
本文将详细探讨JSONP的工作原理以及如何在实际项目中使用它来跨域获取JSON数据。 ### JSONP简介 JSONP全称为"JSON Padding",它并不是JSON的一种新格式,而是一种利用动态创建`<script>`标签来绕过同源策略的技巧...
JSONP是一种绕过同源策略的方法,其原理是利用`<script>`标签可以跨域加载资源的特性。JSONP的工作流程如下: 1. 客户端(浏览器)创建一个`<script>`元素,并设置其`src`属性为服务端的URL,该URL通常包含一个回调...
JSONP的工作原理是利用`<script>`标签不受同源策略限制的特点,通过动态创建并插入一个`<script>`标签来发起请求,然后服务器返回一个包含回调函数的JavaScript代码片段。 **JSONP的产生背景**主要是为了解决跨域...
JSONP(JSON with Padding)是一种常见的解决JavaScript跨域问题的技术。由于浏览器的同源策略限制,JavaScript通常不能向不同源的服务器...了解和掌握JSONP有助于理解跨域请求的原理,为解决实际问题提供更多的选择。
JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了HTML中`<script>`标签可以不受同源策略限制的特性,实现浏览器与服务器之间的数据通信。在Web开发中,由于同源策略的限制,JavaScript通常无法直接访问...
通过上述的实现原理和示例代码,我们可以看到JSONP是一种相对简单且高效的跨域请求解决方案,特别适用于那些不能修改CORS配置的老旧API接口。然而,随着现代浏览器对CORS的支持越来越好,开发者们更倾向于使用CORS来...
然而,为了实现特定功能,如跨域调用Window服务来获取本机硬件信息,我们需要采用一些特殊的技术来规避这种限制。本文将详细介绍如何使用JS进行跨域调用,特别是结合WCF(Windows Communication Foundation)技术和...
2. JSONP原理:JSONP的基本思想是,服务器提供一个可以接受参数的JavaScript函数名,客户端在请求时传递这个函数名,服务器返回一个调用该函数并带有JSON数据的脚本,`<script>`标签加载这个脚本,从而实现跨域数据...
本文将详细介绍JSONP的工作原理以及如何在ASP.NET网站开发中应用JSONP解决Ajax跨域问题。 首先,理解JSONP的基本概念。JSONP是一种非官方的数据交换格式,它的核心思想是利用HTML中的`<script>`标签不受同源策略...
在给定的示例代码中,客户端定义了一个名为jsonpCallback的函数,当从服务器获取数据后,会执行这个函数,并将返回的JSON数据作为参数传递给该函数,实现了数据的跨域访问。 在Jquery中,为了简化JSONP请求的编写,...
本示例“ASPNET_JSONP_demo(jq跨域)”正是展示了如何在 ASP.NET 平台上构建一个 JSONP 服务,并利用 jQuery 进行跨域调用。 首先,我们需要理解 JSONP 的工作原理。JSONP 是通过动态创建 `<script>` 标签来请求数据...
通过分析这个示例,开发者可以理解JSONP的工作原理,并将其应用到实际的项目中,解决跨域数据交互的问题。尽管现代Web开发中有了CORS(Cross-Origin Resource Sharing)这样的更安全的跨域解决方案,但在某些情况下...
JSONP(JSON with Padding)是一种规避同源策略的方法,它通过动态创建 `<script>` 标签来加载服务端返回的JavaScript代码,该代码会调用一个预先定义好的回调函数并传递数据。 以下是一个简单的jQuery跨域Ajax请求...
【JSONP跨域调用与百度搜索框智能提示】 在Web开发中,由于浏览器的同源策略限制,JavaScript无法直接发起跨域请求。为了解决这个问题,JSONP(JSON with Padding)应运而生。JSONP是一种绕过同源策略的技术,通过...
"jsonp跨域请求"可能是服务器返回的示例数据,模拟了JSONP的跨域请求过程。 总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更...
在本示例中,我们将深入探讨JSONP的工作原理,以及如何使用Python来实现JSONP服务。 **JSONP的原理** JSONP的核心思想是通过动态插入`<script>`标签,其`src`属性指向提供数据的服务端URL。服务端返回的不是标准的...
在标题“JS 使用 JSONP 跨域获取用户IP”中,我们可以理解为这个示例将展示如何利用JSONP技术来解决浏览器的同源策略限制,从而获取到用户的IP地址。这在某些场景下非常有用,比如分析用户地理位置、提供个性化服务...