一起看看Java Ajax jsonp跨域请求

一起看看Java Ajax jsonp跨域请求

【相关学习推荐:java基础教程

1、什么是JSONP

一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而u p ` & { S HTML 的<script> 元素J s H = z I q U N是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资8 - + F ) @料并不是 JSONC ) @,而是任意U S 1 E的JavaScript,用 JavaScript 直译器执行而不? j y 2是用 JSON 解析& G f ~ Q R # % t器解析。

JSONP是一种协议,为了解决客户端请求服务器跨域的问@ F : @ & ] 题,但是并非是正式的传输协议。该协议c f N N q + U = _的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据L B { r I,这样客户端] } * K [就可以随意定制自己的函数来自动处理返回数据了.

2、Ajax 请求其他域接口

我这个项目要请求另外一个第一个后台接口请求数据,在页面渲染的p u / n k Q E f c时候,通过ajax加载数据如下:

  $.ajax({
url: 'http://www.xxx.cn/lalala?method=t p r Q y R z :10082&page=1&pageSize=10'_ A Z q R &,
type: 'GET',
dataType: 'json',
timeout: 5000,
contentType: 'applict a ? # T )ation/json; charset=3 / } k n 6utf-8',
success: function (result) {
alter("aaaa");
}
});

这样就出现跨域的错误,如下所示:

Nf ; D eo 'Access-Control-All= 1 Zow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. Th{ Q 4 6 G 2 } t _e response h! / : 9 Nad HTTP status code 500.

一起看看Java Ajax jsonp跨域请求

这里就说明不允许跨域请U y 6 U求,那么怎么办? 换成jsonp好了。就改了dataType这个字段。

  $.ajax({E s a ~ ) _ 6 H I
url: 'http://www.xxx.cn/lalala?method=10082&page=W ( G _ 1 S j 4 (1&pageSize=10',
typt h He: 'GET',
dataType: 'jsonp',
timeout: 5000,
contentType: 'application/json; charset=utf-8',
success: function (result) {
alter("aaaa"S * Z : @);
}
});

结果: Uncaught SyntaxError: Unexpected token!

what the fuck!一起看看Java Ajax jsonp跨域请求 明明请求回来数据,结果还是报错。原因是ajax请求服务器,而返回的数据格式不符合jsonp的返回格式,那么jsonp格式是什i L L x么样的?

Callback({msg:'this is json data'})

这是什么叼东西,奇葩谁定义的!如果你这么想,看来你没有仔细看第1点,JSON是一种轻量级的数据交换格式,像xmlb e I一样。JSONP是一种使用JSON数据的方式,返回的不是JSON对象,是包含JSON对象的javaScript脚本。但是上图是B N e ( } _ = m一段json串,所以报错啦。

3、参数返回处理

有一点你会发现在你是用jsonp协议请求时,在参数中除了自己填写的参数外还有名为callback的参数,如图:

一起看看Java Ajax jsonp跨域请求

看看这个参数是什么东西,因为我在ajax请求的时候没有指定,jsonp这个参数,那么系统k c V默认参数名为“callback”。没有指定jsonpCallback参数, 那么jquery会生成随机的函数名,如上图所示。

比如我如下. U n @ ~ B K配置:

$.ajax({
url: 'http://wwi y 5 jw.xxx.cn/lalala?method=10082&page=1&pageSize=10',
type: 'GET',
dataType: 'jsonpd % t i * K -',
jsonp:'callbacka',//传递x p 6 1 g |给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback:"su & 1ccess_jsonpCallback",//自定义的jsonp回调函数名( _ 8 c r V称,默认为jQuery自动6 q U Q x / X l生成的随机函数名
timeoul ? ; 3t: 5000,
contentType: 'applicatik A Kon/js d m y &on; charset=utf-8',
succen P ] n J Z E U 9ss: function (result) {
alter("aaaa");
}
})~ 1 W ~ 9;

那么服务器亦可以通过下面方法获取回调的函数名:

代码如下:- I J G

string calO F hlbackFunName =O [  d 3 (request.getParamete^ r D $r("callbacka");//获取的就是success_jsonpCw ~ ( $  9 nallback 字符串

注意:系统会区分函数名大小写。

一起看看Java Ajax jsonp跨域请求

那么下面按照格式包装一下9 k ? . $ , p看看咯:

String callback = request.getParameter("callback"- A M z); //不指定函数名默认 callback^ m D ; H Q ! Y
return callback+ "(" + jsonStr + ")"

包了一下,结T I I q | u 5 w h果真的不报错,看下返回数据如下图:

一起看看Java Ajax jsonp跨域请求

4、JSONP的执行过程

首先在客户端注册一个callbh e Wack (如:c p o [ 0 A'jsoncallback'), 然后把calN V A clback的名字(如:j_ Y z | ~ 1 / w qsonp1236827957501)传给服务器。注意:服务端得到callback的数值后,要用jsonp1236827957501(......Y T Y z M k * ])把将要输出 | R q k Y ( : F的json内容包括起来,此时,服务器q w g 5 c生成 json 数L & K % U E - ]据才能被客户端H j ` T ?正确接收。

然后,u ^ ejavascript 语法的方式,生成一个function, functw 7 ^ W kion 名字就是传递上来的参数 'jsoncallback'的值 jsonp1236827957501 .

最后,将 json 数据直! Q | @ Z J ]接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。客户端浏览器,解析scrim u $ p n w = {pt标签,并执行返回的 javascript 文档,此时javascript@ 9 n # V T k m档数据,作为参数, 传入到了客户端预先定义好的 callback 函数(如上例中jquery $.ajax()方法封装的的succeM n B gss: function (json))里。

相关文章推荐:ajaxZ : T : L [ ;视频教程

以上就是一起看看Java Ajax jsonp跨域B { L i请求的详细内容。