易课寄在线购课系统开发笔记(三十)–通过token查询用户信息
通过 token 查询用户信息
功能分析
请求的 url:/user/token/{token}
参数:String token 需要从 url 中取, String callback
返回值: JSON 数据。使用 ECoursesResult 包装 EcoursesUser 对象。
业务逻辑:
1、从 url 中取参数;
2、根据token查询 Redis;
3、如果查询不到数据。返回用户已经过期;
4、如果查询到数据,说明用户已经登录;
5、需要重置 key 的过期时间;
6、把 JSON 数据转换成 EcoursesUser 对象,然后使用 ECoursesResult 包装并返回。
Dao层
使用 JedisClient 对象。
Service层
参数:String token
返回值: ECoursesResult
@Override
public ECoursesResult getUserByToken(String token) {
//根据token到redis中取用户信息
String json = jedisClient.get("SESSION:" + token);
//取不到用户信息,登录已经过期,返回登录过期
if (StringUtils.isBlank(json)) {
return ECoursesResult.build(201, "用户登录已经过期");
}
//取到用户信息更新token的过期时间
jedisClient.expire("SESSION:" + token, SESSION_EXPIRE);
//返回结果,ECoursesResult其中包含EcoursesUser对象
EcoursesUser user = JsonUtils.jsonToPojo(json, EcoursesUser.class);
return ECoursesResult.ok(user);
}
表现层
请求的 url:/user/token/{token}
参数:String token 需要从 url 中取, String callback
返回值: JSON 数据。使用 ECoursesResult 包装 EcoursesUser 对象。
@RequestMapping(value="/user/token/{token}")
@ResponseBody
public Object getUserByToken(@PathVariable String token, String callback) {
ECoursesResult result = tokenService.getUserByToken(token);
//响应结果之前,判断是否为jsonp请求
if (StringUtils.isNotBlank(callback)) {
//把结果封装成一个js语句响应
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}
return result;
}
安全退出
需要根据 token 删除 Redis 中的key。
Dao层
使用 JedisClient 对象。
Service层
参数:String token
返回值: ECoursesResult
@Override
public ECoursesResult userLogout(String token) {
jedisClient.expire("SESSION:" + ":" + token, 0);
return ECoursesResult.ok();
}
表现层
请求的 url:/user/logout/{token}
参数:String token, HttpServletRequest request, HttpServletResponse response
返回值: JSON 数据。使用 ECoursesResult 包装 EcoursesUser 对象。
@RequestMapping(value="/user/logout/{token}", method=RequestMethod.GET)
@ResponseBody
public ECoursesResult logout(@PathVariable String token,
HttpServletRequest request, HttpServletResponse response){
ECoursesResult result = loginService.userLogout(token);
CookieUtils.setCookie(request, response, TOKEN_KEY, null);
return result;
}