Java Ajax jsonp跨域请求的案例分析

  介绍

这篇文章主要介绍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:意想不到的令牌!

什么他妈的! 癑ava明明请求回来数据,结果还是报的错。原因是Ajax请求服务器,而返回的数据格式不符合jsonp的返回格式,那么jsonp格式是什么样的?

回调({味精:& # 39;这是json数据# 39;})

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

<强> 3,参数返回处理

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

癑ava

看看这个参数是什么东西,因为我在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字符串

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

癑ava

那么下面按照格式包装一下看看咯:

弦调=request.getParameter (“callback");//不指定函数名默认回调
  
  回调+“(“+ jsonStr +“), 

包了一下,结果真的不报的错,看下返回数据如下图:

Java Ajax jsonp跨域请求的案例分析