Design and Implementation of an Online Course Purchase System(30)

Querying user information by token

Posted by Chen Xingxu on June 3, 2020

易课寄在线购课系统开发笔记(三十)–通过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;
}