1、什么是JSONP
一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
JSONP是一种协议,为了解决客户端请求服务器跨域的问题,但是并非是正式的传输协议。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
JSONP是一种协议,为了解决客户端请求服务器跨域的问题,但是并非是正式的传输协议。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
我们使用JSONP也是为了解决接口的跨域问题,因为我们的接口可能会被别的合作方调用,但是让项目支持跨域请求是不安全的,因此我们要支持jsonp请求来让别人能够调用到我们的接口。若出现跨域的情况,我们的接口会报如下错误:No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 500.
2、解决方式
ajax请求代码
$(function(){
$("#btn").click(function(){
$.ajax({
url : "http://192.168.0.199/dsp/j/content?channel=ysjssh",
type : "GET",
contentType: 'application/json; charset=utf-8',
jsonpCallback:"success_jsonpCallback",
dataType : "jsonp", // 返回的数据类型,设置为JSONP方式
jsonp : "callback", //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
success: function(callback){
alert(callback);
}
});
});
});
function callback(data) {
alert(data)
}
后台请求代码
@RequestMapping(value = "/j/xxx", produces = "text/script;charset=UTF-8")
@ResponseBody
public String getxxx(HttpServletRequest request, HttpServletResponse response, String callback,) {
Map<String, Object> resultMap = new HashMap<>();
JSONObject object = new JSONObject(resultMap);
return callback + "(" + object.toString() + ")";
}
划重点!!注意RequestMapping的注解内容,加入produces