这篇文章主要介绍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?method=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?method=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?method=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 +“),
包了一下,结果真的不报的错,看下返回数据如下图: