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请求来实现动态数据,会导致搜索引擎认为该网页没有更新,②会降低搜索引擎优先级
本文介绍了在JavaScript中因跨域问题导致的数据传输失败,详细讲解了什么是跨域,以及如何使用JSONP(JSON with Padding)来解决这个问题。文章提到了JSONP的两种实现方式,并指出了JSONP存在的缺点,包括需要页面加载完成后执行以及可能降低搜索引擎优先级的问题。
1381

被折叠的 条评论
为什么被折叠?



