0.问题背景
前台系统(服务层rest+表现层protal)
需要服务层传递json数据给表现层,此时因跨域导致传输数据失败
1.什么是跨域
JavaScript为了安全有一个限制,不允许跨域访问数据(也就是不能访问服务端直接得到数据),但是可以跨域请求js片段
跨域:
- 两个url的域名不相同
- url相同,但是端口不相同
- ip不相同
2.如何实现jsonp
本质是这样的:
具体有两种实现方式
- Handler返回字符串,通过传进来的参数callback(js方法名),手动将son对象内数据包装,即返回 callback(json数据)
//返回字符串的话,浏览器Content-Type:text/html会出现乱码,所以需要手动设置成json
@RequestMapping(value="/list",produces=MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
@ResponseBody
public String getItemCatList(String callback) {
//ItemCatResult只有一个属性data用于存放json字符串
ItemCatResult result = itemCatService.getItemCatList();
String json = JsonUtils.objectToJson(result);
if(StringUtils.isBlank(callback)) {
return json;
}else {
//包装成callback(json)形式
return callback+"("+json+");";
}
}
- Handler返回对象,通过MappingJacksonValue的对象处理json对象,通过MappingJacksonValue的方法来自动包装json
@RequestMapping("/list")
@ResponseBody
public object getItemCatList(String callback) {
ItemCatResult result = itemCatService.getItemCatList();
String json = JsonUtils.objectToJson(result);
if(StringUtils.isBlank(callback)) {
return result;
}else {
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}
}
3.jsonp存在问题
jsonp主要是传输js给表现层,所以①需要在网页加载完之后才能执行
jsonp靠的是ajax请求,如果网页大部分由ajax请求来实现动态数据,会导致搜索引擎认为该网页没有更新,②会降低搜索引擎优先级