使用jquery的getjson()遇到的跨域访问问题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

环境描述

  • 服务器:使用jersey提供RESTful接口
  • 客户端:使用jquery的getJson()方法异步获取数据
  • 希望实现的功能:服务器端以json格式提供RESTful的数据访问,客户端通过ajax异步加载的方式读取数据。

出问题代码

(其实下面代码也不包含错误,只是在执行的时候会出问题)

客户端原始代码:

document.getElementById("mydiv").innerHTML = "data";
$(function(){
     $.getJSON("******", function (data) {
         alert("go");
         document.getElementById("mydiv").innerHTML = "hahahah";
     });
});

服务器端原始代码:

@GET
@Path("/test")
@Produces("application/json;charset=utf8")
public String go(){
    return "({\"num\":\"3\"}";
}

结果运行的时候就出问题了,客户端的回调函数死活不执行。用Firefox的Httpfox调试下,发现在获取json数据的时候就遇到问题,报错application/json (NS_ERROR_DOM_BAD_URI)
网上找了下,说是jquery跨域访问的安全问题,就是说:

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。首先什么是跨域,简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象。

上边的代码中,客户端和服务端确实在不同的服务器,使用不同的IP地址和端口号,因此出现了问题。

解决办法就是JSONP,全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。其基本原理是利用了 HTML 里 元素标签可以跨域访问,因此将数据封装成为js回调函数的格式进行传输访问。

举个例子,上述的数据{"num":"3"},这时不能跨域访问的,那么救把它包装为js,callback('{"num":"3"}'),将数据包装为回调函数的参数,就可以跨域访问了。这就需要解决一个问题,提供数据访问的服务器必须进行数据封装的操作,如果响应的时候还是把原来的json格式数据输出,那么客户端是拿不到需要的数据的。

如果说服务器没有对数据进行封装,那么出现的问题就是回调函数死活不执行。即使用Httpfox进行调试,也会发现虽然正确访问了数据链接,服务器也返回了数据,但回调函数就是执行不了。就是因为这个问题困了我整整两天……

解决方案

其实jQuery已经封装了JSONP的使用

$.getJSON( "****?jsoncallback=?", function( data ){
    // 处理跨域请求得到的数据
});

jquery会把jsoncallback后边的?替换为一个字符串作为数据访问的回调函数的函数名,在服务器端需要读取该参数,然后使用它对数据进行封装,也就是改成f(data)的样式,加上函数名和括号就行了。

服务器端代码为:

    @GET
    @Path("/test")
    @Produces("application/json;charset=utf8")
    public String go(@QueryParam("jsoncallback") String jsoncallback){
        System.out.println(jsoncallback);
        String info = jsoncallback+"({\"num\":\"3\"})";
        return info;
    }

ok,再访问就没有问题了!

PS:最后吐槽一下网络上的各种解决方案,都是只给一个jsoncallback参数,服务器需要怎么改一点都不说,结果整整两天一直困在回调函数不执行的苦恼中……

感谢基于JQuery、Jsonp与Jersey的跨域访问这篇文章替我找到了回家的路!

解决jQuery问题的方法 在上面的示例中,url参数指定了请求的地址,dataType参数设置为’jsonp’,并且通过jsonpCallback参数指定了回调函数的名称。在上面的示例中,url参数指定了请求的地址,type参数设置为’GET’,并通过xhrFields参数设置withCredentials为true,以允许请求发送身份凭证(如cookies)。通过在服务器端设置响应头,允许特定的名进行请求。在上面的示例中,通过使用request模块将请求转发到目标服务器,并将目标服务器的响应返回给客户端。 阅读详情

相关推荐

问题解析:利用jQuery解决限制

当我们在浏览器中发起请求时,由于浏览器的同源策略(Same-Origin Policy),请求会被阻止,导致无法获取所需的数据。当我们在浏览器中发起请求时,由于浏览器的同源策略(Same-Origin Policy),请求会被阻止,导致无法获取所需的数据。举例来说,如果我们的网页部署在http://example.com 名下,那么对于请求http://api.example.com 的数据就会被浏览器拦截。为了绕过浏览器的同源策略,我们需要在服务端设置响应头,允许特定名的请求。

WfTest的博客 1679

jquery中的JSONP

jquery中的$.ajax()函数,除了可以发起真正的Ajax数据请求之外,还可以发起JSONP数据请求,例如: $.ajax({ url: 'http://www.liulongbin.top:3006/api/jsonp?name=zs&age=20', dataType: 'jsonp', success: function (res) { console.log(res);

m0_62962469的博客 5730

解决所有请求问题jQuery方法

请求是指在浏览器中发起一个请求,该请求的目标地址与当前页面的名不一致。由于浏览器的安全限制,正常情况下,请求是被禁止的。除了上述的JSONP方式,还可以使用其他方法来解决请求问题,例如使用CORS(资源共享)或代理服务器等方式。需要注意的是,为了使请求成功,服务器端也需要进行相应的配置。你可以从jQuery的官方网站上下载最新版本的库文件,并在你的HTML文件中引入它。方法是一个强大且灵活的方法,可以发送各种类型的HTTP请求,包括GET、POST等。需要注意的是,我们将。

WfTest的博客 591

jQuery jsonp请求

首先我们需要明白,在页面上直接发起一个的ajax请求是不可以的,但是,在页面上引入不同上的js脚本却是可以的,就像你可以在自己的页面上使用<img src=""> 标签来随意显示某个上的图片一样。jsonp的实现方式其实就是<script>脚本请求地址的方式一样,只是ajax的jsonp对其做了封装,所以可想而知,jsonp是不支持POST方式的。至此,我们算是把数据请求回来了,但是比较麻烦,需要自己写脚本发起请求,然后写个回调函数处理数据,不是很方便。2、接下来看如何发起请求。

考拉很OK 2017

使用jquerygetjson()遇到的访问问题(二)——使用拦截器进行数据封装

上一篇我们提到了使用jsonp来解决getjson访问问题,服务器需要对数据进行一次封装,实际上jersey已经实现了这个功能,具体用法也很简单,加上@JSONP标识就行。 对上一篇的服务器代码进行修改: @GET @JSONP(queryParam = "jsoncallback") @Path("/test") @Produces("application/

felcon的专栏 1205

jquery访问解决方案

客户端“访问”一直是一个头疼的问题,好在有jQuery帮忙,从jQuery-1.2以后问题便迎刃而解。由于自己在项目中遇到问题,借此机会对问题来刨根问底,查阅了相关资料和自己的实践,算是解决了问题。便记录下来,以供查阅。 jQuery.ajax()支持get方式的,这其实是采用jsonp的方式来完成的。真实案例:$.ajax({ async:false, url:...

awld55183的博客 156

ajax 功能,JavaScript之Ajax-7 Ajax请求(Ajax概述、Ajax实现)

一、Ajax概述同源策略-同源策略(Same origin policy)是一种约定,它是浏览器的核心也最最基本的核心。如果少了同源策略,则浏览器的正常功能可能都会收到影响。可以说Web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现- 它是由 Netscape 提出的一个著名的安全策略- 现在所有支持 JavaScript 的浏览器都会使用这个策略- 所谓同源策略是指,名、协议...

weixin_39747755的博客 152

使用phonegap框架调用jquery $.getJSON(url,data,functio...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34413065的博客 97

ajax jsonp返回error,jQuery ajax request using jsonp error

I'm writing an app and I need to access some json data in the client side from another server. Because of the cross domain issue I plan on using jsonp. jQuery allows me to do this using the $.getJSON(...

weixin_31668255的博客 209

使用jquery完成访问

jquery实现访问有两种方式,一个是$.getJSON,一个是$.ajax,注意只有get请求才能实现访问。 一、$.getJSON实现访问 get.html: <!doctypehtml> <html> <head> <metacharset="utf-8"> <title>javascript和jquery访问</title> <scripttype="text/javascript"src...

xiaozhuangyumaotao的博客 1万+

jquery中ajax处理的三大方式

由于JS同源策略的影响,因此js只能访问名下的文档。因此要实现,一般有以下几个方法: 一、处理的方式: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已经实现了访问。但ie10以下不支持 只需要在服务端填上响应头: ? 1 2 3 header("Access-...

dijuwu9326的博客 6120

jquery+getJson+struts2, 访问问题

问题无法访问或者放回空 问题2 返回 标签不对 这次使用ajax访问遇到以上问题,网上也找到很多的资料,可都是只说前面或者我着急没有仔细理解。 然后第二天有仔细的进行调试,边看参考手册。 ajax篇解决   预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调

sunlongfei_001的专栏 1678

关于jquerygetJSON访问

jquery1.2之后getJSON支持访问 jquery官网上的例子:$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data){ $.ea

4727

jQuery.getJSON访问的正确使用方式(史上最傻瓜式解释)

https://www.cnblogs.com/wavky/p/4181320.html 最近花了2天时间完整的看了一遍 jQuery 的API,其中 $.getJSON(url[, data][, callback]) 方法的访问解释真心看的一头雾水,大家可以从这里感受一下: http://hemin.cn/jq/jQuery.getJSON.html http://www.w3s

wongdei123321的博客 4612

jquery.getJSON方案实现原理

jquery.getJSON在实现与后台程序异步交互方面非常的方便,在不牵扯的情况下,实现也很简单。 使用方法为: $.getJSON('http://***.**/test/test.php', {'uid':1235,'cid':5678}, function(data){ if(data.success == 1){ alert(data.messag

xiaoxigua666的专栏 2341

jquery getJSON不执行问题解决

文章目录出现问题的原因及解决方案1 getJSON请求是否成功2 回调是否成功3 Ajax问题3.1 解决方法附: sublimeServer启动和使用 出现问题的原因及解决方案 如果遇到getJSON不执行问题 请根据以下步骤一次对号入座并解决 1 getJSON请求是否成功 跟踪一下服务器端的后台代码,看前台是否发送请求成功,后台是否成功接收请求 2 回调是否成功 你可以在原回调函...

Congying-Wang的博客 4149

getJson遇到的问题

在项目中遇到的这个问题.要注意的两点:(1)必须是get方式;(2)必须是json格式. 直接用的jquerygetJson,那么后台返回的数据必须是json格式,同时,在url添加callback参数: 例: $.getJSON('http://www.baidu.com?jsonpCallback=?',function(data){ }); 用$.ajax()

和上帝躲猫猫 1474
上一篇: MySQL主从备份设置
下一篇: 使用jquery的getjson()遇到的跨域访问问题(二)——使用拦截器进行数据封装
felcon
博客等级 码龄19年 33粉丝 110原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值