`
小杨学JAVA
  • 浏览: 905249 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSONP的解决基本跨域问题方案<转>

 
阅读更多

转:http://my.oschina.net/liuxiaori/blog/64256

一种解决方式

首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:

 

01 $(document).ready(function(){
02    var url='http://localhost:8080/WorkGroupManagment/open/getGroupById"
03        +"?id=1&callback=?';
04    $.ajax({
05      url:url,
06      dataType:'jsonp',
07      processData: false,
08      type:'get',
09      success:function(data){
10        alert(data.name);
11      },
12      error:function(XMLHttpRequest, textStatus, errorThrown) {
13        alert(XMLHttpRequest.status);
14        alert(XMLHttpRequest.readyState);
15        alert(textStatus);
16      }});
17    });

 

这样写是完全没有问题的,起先error的处理函数中仅仅是alert(“error”),为了进一步弄清楚是什么原因造成了错误,故将处理函数变为上面的实现方式。最后一行alert使用为;parsererror。百思不得其解,继续google,最终还是在万能的stackoverflow找到了答案,链接在这里。原因是jsonp的格式与json格式有着细微的差别,所以在server端的代码上稍稍有所不同。

比较一下json与jsonp格式的区别:

json格式:
1 {
2     "message":"获取成功",
3     "state":"1",
4     "result":{"name":"工作组1","id":1,"description":"11"}
5 }

 

jsonp格式:
1 callback({
2     "message":"获取成功",
3     "state":"1",
4     "result":{"name":"工作组1","id":1,"description":"11"}
5 })

 

看出来区别了吧,在url中callback传到后台的参数是神马callback就是神马,jsonp比json外面有多了一层,callback()。这样就知道怎么处理它了。于是修改后台代码。

后台java代码最终如下:

 

01 @RequestMapping(value = "/getGroupById")
02   public String getGroupById(@RequestParam("id") Long id,
03       HttpServletRequest request, HttpServletResponse response)
04       throws IOException {
05     String callback = request.getParameter("callback");
06     ReturnObject result = null;
07     Group group = null;
08     try {
09       group = groupService.getGroupById(id);
10       result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS);
11     catch (BusinessException e) {
12       e.printStackTrace();
13       result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED);
14     }
15     String json = JsonConverter.bean2Json(result);
16     response.setContentType("text/html");
17     response.setCharacterEncoding("utf-8");
18     PrintWriter out = response.getWriter();
19     out.print(callback + "(" + json + ")");
20     return null;
21   }

 

注意这里需要先将查询结果转换我json格式,然后用参数callback在json外面再套一层,就变成了jsonp。指定数据类型为jsonp的ajax就可以做进一步处理了。

虽然这样解决了跨域问题,还是回顾下造成parsererror的原因。原因在于盲目的把json格式的数据当做jsonp格式的数据让ajax处理,造成了这个错误,此时server端代码是这样的:

 

01 @RequestMapping(value = "/getGroupById")
02   @ResponseBody
03   public ReturnObject getGroupById(@RequestParam("id") Long id,
04       HttpServletRequest request, HttpServletResponse response){
05     String callback = request.getParameter("callback");
06     ReturnObject result = null;
07     Group group = null;
08     try {
09       group = groupService.getGroupById(id);
10       result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS);
11     catch (BusinessException e) {
12       e.printStackTrace();
13       result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED);
14     }
15     return result;
16   }

 

至此解决ajax跨域问题的第一种方式就告一段落。

 

 

追加一种解决方式

追求永无止境,在google的过程中,无意中发现了一个专门用来解决跨域问题的jQuery插件-jquery-jsonp

有第一种方式的基础,使用jsonp插件也就比较简单了,server端代码无需任何改动。

来看一下如何使用jquery-jsonp插件解决跨域问题吧。

 

01 var url="http://localhost:8080/WorkGroupManagment/open/getGroupById"
02     +"?id=1&callback=?";
03 $.jsonp({
04   "url": url,
05   "success"function(data) {
06     $("#current-group").text("当前工作组:"+data.result.name);
07   },
08   "error"function(d,msg) {
09     alert("Could not find user "+msg);
10   }
11 });

 

至此两种解决跨域问题的方式就全部介绍完毕。

 

原文地址:http://www.congmo.net/blog/2012/06/27/ajax-cross-domain/

 

 

 

http://wuyechun.iteye.com/blog/1130165

分享到:
评论

相关推荐

    跨域访问解决方法-jsonp

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

    js跨域解决方案

    1. **JSONP(JSON with Padding)**:JSONP是一种早期的跨域解决方案,它依赖于`&lt;script&gt;`标签不受同源策略限制的特点。通过动态创建`&lt;script&gt;`标签,设置其`src`属性为提供服务的服务器接口,并由服务器返回一个包裹...

    JSONP三种方式解决跨域问题

    1、地址...演示跨域问题以及跨子域名解决方法 2、地址http://a.test.com:8888/testAjaxCross/public/jsonp.do 演示jsonp解决跨域问题的三种方案jsonp、$getJSON、$ajax等

    JQuery跨域访问解决方案

    JQuery的跨域解决方案主要依赖于JSONP(JSON with Padding)技术。JSONP是一种绕过同源策略的方式,它利用HTML中的`&lt;script&gt;`标签没有同源策略限制的特点。当jQuery使用`dataType: 'jsonp'`时,它实际上是在做以下几...

    jsonp跨域解决源代码

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

    jsonp解决跨域_js_方案_web_跨域_

    标题中的“jsonp解决跨域”指的是JavaScript对象标记协议(JSON with Padding,简称jsonp)这一跨域数据交互协议,它是Web应用程序中广泛使用的一种解决同源策略限制的技术。同源策略是浏览器为了安全而实施的一项...

    JSONP实现Ajax跨域访问

    JSONP作为一种解决方案,可以通过简单的脚本标签注入方式实现跨域数据的获取。 #### 二、同源策略与跨域问题 同源策略是Web浏览器为了保护用户隐私而设置的一种安全机制。该策略规定,来自不同源的客户端脚本在...

    Ajax跨域请求解决方案-JSONP

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

    使用Jsonp方式跨域获取json

    综上所述,JSONP是解决跨域问题的一种传统手段,虽然现在有CORS等更安全的解决方案,但在某些情况下,尤其是需要兼容老版本浏览器或者无需POST请求时,JSONP仍然是一个实用的选择。在实际项目中,了解和掌握JSONP的...

    php版 解决跨域问题CORS ajax+get,post+jsonp例子源代码.zip

    JSONP的基本原理是利用`&lt;script&gt;`标签不受同源策略限制的特性,通过动态创建`&lt;script&gt;`标签来请求数据。服务器返回的不是JSON数据,而是包裹在函数调用中的JSON数据,例如: ```javascript callback({key: 'value'}...

    jsonp跨域请求

    JSONP(JSON with Padding)是一种常见的解决JavaScript跨域问题的技术。由于浏览器的同源策略限制,JavaScript通常不能向不同源的服务器发起XMLHttpRequest请求。但JSONP通过动态插入`&lt;script&gt;`标签的方式,巧妙地...

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

    在Web开发中,跨域(Cross-Origin)是一个常见的问题,由于浏览器的安全策略限制,JavaScript通常不能直接访问不同源(协议+域名+端口)的资源。...开发者应根据实际需求和兼容性考虑选择合适的跨域方案。

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

    1. "jsonp能跨域即在服务器A上访问服务器B.txt" - 这个文件可能包含了关于JSONP如何实现跨域请求的基本原理和步骤,通过动态创建`&lt;script&gt;`标签来加载服务器B的数据,从而绕过同源策略。 2. "不管是否跨域,只要用...

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

    本文将深入探讨两种主要的跨域解决方案:CORS(Cross-Origin Resource Sharing)和JSONP(JSON with Padding)。 ### CORS方案 CORS是一种现代浏览器支持的跨域策略,允许服务器声明哪些源可以访问其资源。服务器...

    jsonp跨域请求数据实现手机号码查询实例分析.docx

    JSONP 是一种跨域数据交互的方案,它利用了`&lt;script&gt;`标签不受同源策略限制的特点来实现跨域数据请求。其工作流程大致如下: 1. **客户端**发起一个HTTP请求,该请求包含一个回调函数名。 2. **服务器**接收到请求后...

    深入浅析Jsonp解决ajax跨域问题

    为了有效理解JSONP解决Ajax跨域问题的知识点,我们首先需要明确几个关键概念: 1. **同源策略(Same-Origin Policy)**:这是浏览器安全策略的核心之一,用于控制不同源之间的文档或脚本的交互。一个“源”通常由...

    jquery下利用jsonp跨域访问实现方法

    JSONP是一种解决跨域问题的技术,其核心思想是利用`&lt;script&gt;`标签不受同源策略限制的特性。当浏览器解析到`&lt;script&gt;`标签时,会发出一个GET请求,而无论该URL是否与当前页面的源相同。服务器返回的不是普通的JSON...

    ASPNET_JSONP_demo(jq跨域)

    所有这些组件协同工作,构成了一个完整的 ASP.NET JSONP 跨域解决方案。 总之,通过 ASP.NET 和 jQuery 实现 JSONP 跨域通信,开发者可以轻松地跨越同源策略的限制,实现前后端数据交互。这个示例项目提供了一个...

    6种解决跨域的方案

    以下是对标题和描述中提及的6种解决跨域方案的详细解释: 1. **设置响应参数解决跨域**: 这种方法通常在服务器端通过设置HTTP响应头来实现。最常用的是在`Access-Control-Allow-Origin`头部指定允许跨域的源。...

    jsonp跨域获取百度联想词的方法分析.docx

    JSONP是一种解决JavaScript跨域问题的有效方法,尤其适用于简单的GET请求。但需要注意的是,它不支持POST等其他HTTP方法,也无法处理状态码和头部信息,而且只适用于支持动态注入脚本的场景。在实际开发中,考虑到...

Global site tag (gtag.js) - Google Analytics