这篇文章将为大家详细讲解有关Java中的跨域请求怎么利用Ajax jsonp实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强> 1,什么是jsonp 强>
一般来说位于server1.example.com的网页无法与不是server1.example.com的服务器沟通,而HTML的& lt; script>元素是一个例外。利用& lt; script>元素的这个开放策略,网页可以得到从其他来源动态产生的JSON资料,而这种使用模式就是所谓的JSONP。用JSONP抓到的资料并不是JSON,而是任意的JavaScript,用JavaScript直译器执行而不是用JSON解析器解析。
JSONP是一种协议,为了解决客户端请求服务器跨域的问题,但是并非是正式的传输协议。该协议的一个要点就是允许用户传递一个回调参数给服务端,然后服务端返回数据时会将这个回调参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
<强> 2,Ajax请求其他域接口强>
我这个项目要请求另外一个第一个后台接口请求数据,在页面渲染的时候,通过Ajax加载数据如下:
. ajax({美元 url: & # 39; http://www.xxx.cn/lalala& # 63;方法=10082,=1页,页大?10 & # 39; 类型:& # 39;得到# 39; 数据类型:& # 39;json # 39; 超时:5000, application/json contentType: & # 39;;charset=utf - 8 # 39; 成功:函数(结果){ 改变(“aaaa"); } });
这样就出现跨域的错误,如下所示:
没有& # 39;Access-Control-Allow-Origin& # 39;头存在alt=" Java中的跨域请求怎么利用Ajax jsonp实现">
这里就说明不允许跨域请求,那么怎么办?换成jsonp好了。就改了数据类型这个字段。
. ajax({美元 url: & # 39; http://www.xxx.cn/lalala& # 63;方法=10082,=1页,页大?10 & # 39; 类型:& # 39;得到# 39; 数据类型:& # 39;jsonp # 39; 超时:5000, application/json contentType: & # 39;;charset=utf - 8 # 39; 成功:函数(结果){ 改变(“aaaa"); } });
结果:未捕获SyntaxError:意想不到的令牌!
什么他妈的! 明明请求回来数据,结果还是报的错。原因是Ajax请求服务器,而返回的数据格式不符合jsonp的返回格式,那么jsonp格式是什么样的?
回调({味精:& # 39;这是json数据# 39;})
这是什么叼东西,奇葩谁定义的!如果你这么想,看来你没有仔细看第1点,JSON是一种轻量级的数据交换格式,像xml一样.JSONP是一种使用JSON数据的方式,返回的不是JSON对象,是包含JSON对象的javaScript脚本。但是上图是一段JSON串,所以报错啦。
<强> 3,参数返回处理强>
有一点你会发现在你是用jsonp协议请求时,在参数中除了自己填写的参数外还有名为回调的参数,如图:
看看这个参数是什么东西,因为我在Ajax请求的时候没有指定,jsonp这个参数,那么系统默认参数名为“回调”。没有指定jsonpCallback参数,那么jquery会生成随机的函数名,如上图所示。
比如我如下配置:
. Ajax({美元 url: & # 39; http://www.xxx.cn/lalala& # 63;方法=10082,=1页,页大?10 & # 39; 类型:& # 39;得到# 39; 数据类型:& # 39;jsonp # 39; jsonp: & # 39; callbacka& # 39;//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:回调) jsonpCallback:“success_jsonpCallback"//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名 超时:5000, application/json contentType: & # 39;;charset=utf - 8 # 39; 成功:函数(结果){ 改变(“aaaa"); } });
那么服务器亦可以通过下面方法获取回调的函数名:
代码如下:字符串callbackFunName=request.getParameter (“callbacka");//获取的就是success_jsonpCallback字符串
注意:系统会区分函数名大小写。
那么下面按照格式包装一下看看咯:
弦调=request.getParameter (“callback");//不指定函数名默认回调 回调+“(“+ jsonStr +“),