jsonp跨域请求
项目中的错误
因为js不支持跨域请求,而有时候又必须要对其他的系统进行跨域获取数据,测试中报错信息如下
XMLHttpRequest cannot load http://localhost:8088/item/token/b993c14f-de0d-4c36-ba1b-5123c17dc5f0. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8082' is therefore not allowed access.
所谓跨域:就是不同域名,同域名不同端口,同域名不同IP地址
在项目中:往往需要各个独立的应用中,js需要获取其他应用下的数据,但是js却不支持跨域请求,可能处于安全性考虑。
原理
jsonp的跨域可以算是js的一种漏洞,其原理是
<script src="/js/main.js"/>
script标签的src中url地址,这个标签可以加载跨域请求的js,并且返回这个js,这一点你可以只在开发者工具中直接查看。
利用script的src属性,我们在本地定义一个function demo1(data){对data进行业务处理}
一个跨域请求的ajax,请求数据,带参数callback=demo1,
支持jsonp的服务端,判断参数是否有callback,有的话
进行跨域处理,返回demo1({id:1,status:200})这样的数据,
js会认为这是一段js,执行我们已经定义好的demo1这个function
案例
----------
//JS
.ajax({
url : "http://localhost:8088/user/token/" + _ticket,
dataType : "jsonp",
type : "GET",
success : function(data){
if(data.status == 200){
var username = data.data.username;
var html = username + ",欢迎来到我的购物网 class=\"link-logout\">[退出]</a>";
$("#loginbar").html(html);
}
}
});
<span id="loginbar" style="margin-right: 15px;">
<a href="#">请登录</a>
</span>
----------
//Java代码
/* @RequestMapping("/token/{token}")
@ResponseBody
public String getCookieAndUser(@PathVariable String token,String callback){
Result result = tokenService.getCookieAndJson(token);
if(callback != null && !"".equals(callback)){
String call = callback + "(" +JsonUtils.objectToJson(result) +");" ;
return call;
}
return JsonUtils.objectToJson(result);
}*/
@RequestMapping("/token/{token}")
@ResponseBody
public Object getCookieAndUser(@PathVariable String token,String callback){
Result result = tokenService.getCookieAndJson(token);
if(callback != null && !"".equals(callback)){
// String call = callback + "(" +JsonUtils.objectToJson(result) +");" ;
//return call;
MappingJacksonValue jacksonValue = new MappingJacksonValue(result);
jacksonValue.setJsonpFunction(callback);
return jacksonValue;
}
return JsonUtils.objectToJson(result);
}