【Java】jsonp初学

本文介绍了在JavaScript中因跨域问题导致的数据传输失败,详细讲解了什么是跨域,以及如何使用JSONP(JSON with Padding)来解决这个问题。文章提到了JSONP的两种实现方式,并指出了JSONP存在的缺点,包括需要页面加载完成后执行以及可能降低搜索引擎优先级的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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请求来实现动态数据,会导致搜索引擎认为该网页没有更新,②会降低搜索引擎优先级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值