转:http://my.oschina.net/liuxiaori/blog/64256
一种解决方式
首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:
01 |
$(document).ready( function (){
|
09 |
success: function (data){
|
12 |
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
13 |
alert(XMLHttpRequest.status);
|
14 |
alert(XMLHttpRequest.readyState);
|
这样写是完全没有问题的,起先error的处理函数中仅仅是alert(“error”),为了进一步弄清楚是什么原因造成了错误,故将处理函数变为上面的实现方式。最后一行alert使用为;parsererror。百思不得其解,继续google,最终还是在万能的stackoverflow找到了答案,链接在这里。原因是jsonp的格式与json格式有着细微的差别,所以在server端的代码上稍稍有所不同。
比较一下json与jsonp格式的区别:
json格式:
4 |
"result" :{ "name" : "工作组1" , "id" :1, "description" : "11" }
|
jsonp格式:
4 |
"result" :{ "name" : "工作组1" , "id" :1, "description" : "11" }
|
看出来区别了吧,在url中callback传到后台的参数是神马callback就是神马,jsonp比json外面有多了一层,callback()。这样就知道怎么处理它了。于是修改后台代码。
后台java代码最终如下:
01 |
@RequestMapping (value = "/getGroupById" )
|
02 |
public String getGroupById( @RequestParam ( "id" ) Long id,
|
03 |
HttpServletRequest request, HttpServletResponse response)
|
05 |
String callback = request.getParameter( "callback" );
|
06 |
ReturnObject result = null ;
|
09 |
group = groupService.getGroupById(id);
|
10 |
result = new ReturnObject(group, "获取成功" , Constants.RESULT_SUCCESS);
|
11 |
} catch (BusinessException e) {
|
13 |
result = new ReturnObject(group, "获取失败" , Constants.RESULT_FAILED);
|
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 + ")" );
|
注意这里需要先将查询结果转换我json格式,然后用参数callback在json外面再套一层,就变成了jsonp。指定数据类型为jsonp的ajax就可以做进一步处理了。
虽然这样解决了跨域问题,还是回顾下造成parsererror的原因。原因在于盲目的把json格式的数据当做jsonp格式的数据让ajax处理,造成了这个错误,此时server端代码是这样的:
01 |
@RequestMapping (value = "/getGroupById" )
|
03 |
public ReturnObject getGroupById( @RequestParam ( "id" ) Long id,
|
04 |
HttpServletRequest request, HttpServletResponse response){
|
05 |
String callback = request.getParameter( "callback" );
|
06 |
ReturnObject result = null ;
|
09 |
group = groupService.getGroupById(id);
|
10 |
result = new ReturnObject(group, "获取成功" , Constants.RESULT_SUCCESS);
|
11 |
} catch (BusinessException e) {
|
13 |
result = new ReturnObject(group, "获取失败" , Constants.RESULT_FAILED);
|
至此解决ajax跨域问题的第一种方式就告一段落。
追加一种解决方式
追求永无止境,在google的过程中,无意中发现了一个专门用来解决跨域问题的jQuery插件-jquery-jsonp。
有第一种方式的基础,使用jsonp插件也就比较简单了,server端代码无需任何改动。
来看一下如何使用jquery-jsonp插件解决跨域问题吧。
01 |
var url= "http://localhost:8080/WorkGroupManagment/open/getGroupById"
|
05 |
"success" : function (data) {
|
06 |
$( "#current-group" ).text( "当前工作组:" +data.result.name);
|
08 |
"error" : function (d,msg) {
|
09 |
alert( "Could not find user " +msg);
|
至此两种解决跨域问题的方式就全部介绍完毕。
原文地址:http://www.congmo.net/blog/2012/06/27/ajax-cross-domain/
http://wuyechun.iteye.com/blog/1130165
分享到:
相关推荐
总结,JSONP是一种简单且广泛使用的跨域解决方案,尤其适用于那些不支持CORS的旧版本浏览器。然而,考虑到安全性和灵活性,CORS在现代Web开发中已成为更推荐的选择。理解JSONP的工作原理和使用方法对于任何Web开发者...
1. **JSONP(JSON with Padding)**:JSONP是一种早期的跨域解决方案,它依赖于`<script>`标签不受同源策略限制的特点。通过动态创建`<script>`标签,设置其`src`属性为提供服务的服务器接口,并由服务器返回一个包裹...
1、地址...演示跨域问题以及跨子域名解决方法 2、地址http://a.test.com:8888/testAjaxCross/public/jsonp.do 演示jsonp解决跨域问题的三种方案jsonp、$getJSON、$ajax等
JQuery的跨域解决方案主要依赖于JSONP(JSON with Padding)技术。JSONP是一种绕过同源策略的方式,它利用HTML中的`<script>`标签没有同源策略限制的特点。当jQuery使用`dataType: 'jsonp'`时,它实际上是在做以下几...
2. JSONP原理:JSONP的基本思想是,服务器提供一个可以接受参数的JavaScript函数名,客户端在请求时传递这个函数名,服务器返回一个调用该函数并带有JSON数据的脚本,`<script>`标签加载这个脚本,从而实现跨域数据...
标题中的“jsonp解决跨域”指的是JavaScript对象标记协议(JSON with Padding,简称jsonp)这一跨域数据交互协议,它是Web应用程序中广泛使用的一种解决同源策略限制的技术。同源策略是浏览器为了安全而实施的一项...
JSONP作为一种解决方案,可以通过简单的脚本标签注入方式实现跨域数据的获取。 #### 二、同源策略与跨域问题 同源策略是Web浏览器为了保护用户隐私而设置的一种安全机制。该策略规定,来自不同源的客户端脚本在...
本文将详细介绍JSONP的工作原理以及如何在ASP.NET网站开发中应用JSONP解决Ajax跨域问题。 首先,理解JSONP的基本概念。JSONP是一种非官方的数据交换格式,它的核心思想是利用HTML中的`<script>`标签不受同源策略...
综上所述,JSONP是解决跨域问题的一种传统手段,虽然现在有CORS等更安全的解决方案,但在某些情况下,尤其是需要兼容老版本浏览器或者无需POST请求时,JSONP仍然是一个实用的选择。在实际项目中,了解和掌握JSONP的...
JSONP的基本原理是利用`<script>`标签不受同源策略限制的特性,通过动态创建`<script>`标签来请求数据。服务器返回的不是JSON数据,而是包裹在函数调用中的JSON数据,例如: ```javascript callback({key: 'value'}...
JSONP(JSON with Padding)是一种常见的解决JavaScript跨域问题的技术。由于浏览器的同源策略限制,JavaScript通常不能向不同源的服务器发起XMLHttpRequest请求。但JSONP通过动态插入`<script>`标签的方式,巧妙地...
在Web开发中,跨域(Cross-Origin)是一个常见的问题,由于浏览器的安全策略限制,JavaScript通常不能直接访问不同源(协议+域名+端口)的资源。...开发者应根据实际需求和兼容性考虑选择合适的跨域方案。
1. "jsonp能跨域即在服务器A上访问服务器B.txt" - 这个文件可能包含了关于JSONP如何实现跨域请求的基本原理和步骤,通过动态创建`<script>`标签来加载服务器B的数据,从而绕过同源策略。 2. "不管是否跨域,只要用...
本文将深入探讨两种主要的跨域解决方案:CORS(Cross-Origin Resource Sharing)和JSONP(JSON with Padding)。 ### CORS方案 CORS是一种现代浏览器支持的跨域策略,允许服务器声明哪些源可以访问其资源。服务器...
JSONP 是一种跨域数据交互的方案,它利用了`<script>`标签不受同源策略限制的特点来实现跨域数据请求。其工作流程大致如下: 1. **客户端**发起一个HTTP请求,该请求包含一个回调函数名。 2. **服务器**接收到请求后...
为了有效理解JSONP解决Ajax跨域问题的知识点,我们首先需要明确几个关键概念: 1. **同源策略(Same-Origin Policy)**:这是浏览器安全策略的核心之一,用于控制不同源之间的文档或脚本的交互。一个“源”通常由...
JSONP是一种解决跨域问题的技术,其核心思想是利用`<script>`标签不受同源策略限制的特性。当浏览器解析到`<script>`标签时,会发出一个GET请求,而无论该URL是否与当前页面的源相同。服务器返回的不是普通的JSON...
所有这些组件协同工作,构成了一个完整的 ASP.NET JSONP 跨域解决方案。 总之,通过 ASP.NET 和 jQuery 实现 JSONP 跨域通信,开发者可以轻松地跨越同源策略的限制,实现前后端数据交互。这个示例项目提供了一个...
以下是对标题和描述中提及的6种解决跨域方案的详细解释: 1. **设置响应参数解决跨域**: 这种方法通常在服务器端通过设置HTTP响应头来实现。最常用的是在`Access-Control-Allow-Origin`头部指定允许跨域的源。...
JSONP是一种解决JavaScript跨域问题的有效方法,尤其适用于简单的GET请求。但需要注意的是,它不支持POST等其他HTTP方法,也无法处理状态码和头部信息,而且只适用于支持动态注入脚本的场景。在实际开发中,考虑到...