jsonp解决json数据跨域问题

5.2. 首页展示用户名

方案一:在Controller中取cookie中的token数据,调用sso服务查询用户信息。
1、当用户登录成功后,在cookie中有token信息。
2、从cookie中取token根据token查询用户信息。
3、把用户名展示到首页。

方案二:当页面加载完成后使用js取token的数据,使用ajax请求查询用户信息。

问题:服务接口在sso系统中。Sso.e3.com(localhost:8088),在首页显示用户名称,首页的域名是www.e3.com(localhost:8082),使用ajax请求跨域了。

Js不可以跨域请求数据。
什么是跨域:
1、域名不同
2、域名相同端口不同。

解决js的跨域问题可以使用jsonp。

Jsonp不是新技术,跨域的解决方案。使用js的特性绕过跨域请求。Js可以跨域加载js文件。

5.3. Jsonp原理
在这里插入图片描述
5.4. Json实现

5.4.1. 客户端
使用jQuery。
修改这两处
在这里插入图片描述

5.4.2. 服务端
1、接收callback参数,取回调的js的方法名。
2、业务逻辑处理。
3、响应结果,拼接一个js语句。
方法一:

	//@RequestMapping(value="/user/token/{token}",produces="application/json;charset=utf-8")
//设置application/json两种格式都可以
	@RequestMapping(value="/user/token/{token}",produces= MediaType.APPLICATION_JSON_UTF8_VALUE)
	@ResponseBody
	public String getUserByToken(@PathVariable String token, String callback) {
		
		E3Result result = tokenService.getUserByToken(token);
		
		//响应结果之前,判断是否为jsonp请求
		if(StringUtils.isNotBlank(callback)){
			//把结果封装成一个js语句响应
			return callback + "(" +JsonUtils.objectToJson(result) + ");";
		}
			
		return JsonUtils.objectToJson(result);
	}

返回数据格式
在这里插入图片描述
方法二:
Spring 4.1 以后支持

	@RequestMapping(value="/user/token/{token}")
	@ResponseBody
	public Object getUserByToken(@PathVariable String token, String callback) {
		E3Result result = tokenService.getUserByToken(token);
		//响应结果之前,判断是否为jsonp请求
		if (StringUtils.isNotBlank(callback)) {
			//把结果封装成一个js语句响应
			MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
			mappingJacksonValue.setJsonpFunction(callback);
			return mappingJacksonValue;
		}
		return result;
	}

返回数据中多了 /**
在这里插入图片描述

发布了32 篇原创文章 · 获赞 0 · 访问量 985
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览