JSONP是跨域请求的一种解决方案
为什么会出现跨域的问题?
在为了保护浏览器和用户的安全,浏览器不允许对不同域名的不同端口进行ajax访问
及只能对同域名下的同一端口资源进行访问
jsonp实现的背景
在开发中我发现,浏览器允许不同域名之间访问javaScript文件,我们可以将数据伪装成js文件来进行传输,利用这一特点可实现不同web应用之间的数据跨域问题。
jsonp数据传输的格式
设置响应头:content-type: application/javascript
传输的数据格式为:函数名(数据)
jsonp的使用——js写法
$.ajax({
url:'http://localhost/testJsonp',//这里写需要跨域访问的地址
type:'post', //这里是访问方式
dataType:'jsonp', //声明返回值类型为jsonp格式
jsonpCallback:'callback',//传递给服务端的参数值,一般写回调的函数名,可以不写jquery会传递默认值
jsonp:'callback',//传递给服务端的参数名,默认为"callback",
success:function(data){ //匿名函数,写这个匿名函数上面的callback函数名回调就不会生效
alert(data);
}
});
服务端写法
@RequestMapping("/testJsonp")
@ResponseBody
public MappingJacksonValue demo(String callback){
People p = new People();
p.setId(1);
p.setName("张三");
//把构造方法参数转换为 json 字符串并当作最终返回值函数 的参数
MappingJacksonValue mjv = new MappingJacksonValue(p);
//最终返回结果中函数名
mjv.setJsonpFunction(callback);
return mjv;
}
}
其实简单点可以使用字符串拼接的方式
@RequestMapping("/testJsonp")
@ResponseBody
public String demo(String callback){
//获取前段传进来的callback参数作为回调函数名返回
return callback+"(数据)";
}
}