获取用户信息
  • 思考如何获取到用户信息?
    在登陆的时候,服务器会生成token给客户端,那么下一次在请求头的(Authorization)就会携带TOKEN信息。
  1. 根据文档可以知道请求地址、请求方式以及请求参数

UsersController

  • 为什么要单独开一个controller?emmm,还是为了降耦合吧,把接口尽量分离
  • 因为这些还是涉及到了用户表,所以需要SysUserService
@RestController
@RequestMapping("/users")
public class UsersController {
    @Autowired
    private SysUserService sysUserService;

    @GetMapping("currentUser")
    public Result currentUser(@RequestHeader("Authorization") String token){
        return sysUserService.findUserByToken(token);
    }
}
  1. 根据返回数据形式进行分析,返回了用户id、用户账户、用户头像、用户昵称
  • 所以封装一个LoginUserVo类,专门来记录登陆的信息。
@Data
public class LoginUserVo {

    private Long id;

    private String account;

    private String nickname;

    private String avatar;
}

SysUserService

//验证
SysUser checkToken(String token);

SysUserServiceImpl

  • 分析
    1. 判断token是否为空,为空,直接返回null
    2. 不为空,是要用JWTUtils进行验证,会返回一个map
    3. 对返回的map进行判断,map为空,说明啥也没查到,返回null;
    4. 接着进行redis方面的验证,因为当时的key是("TOKEN_" + token),所以也用这个key去get。 返回的是一个JSON字符串,如果该字符串为空,同样也是返回null;
    5. 上面所有为空的逻辑走完了,那么就对这个JSON进行解析,获取user对象。
    6. 返回这个对象。
    @Override
    public SysUser checkToken(String token) {
        if (StringUtils.isBlank(token)){
            return null;
        }
        Map<String, Object> stringObjectMap = JWTUtils.checkToken(token);
        if(stringObjectMap == null){
            return null;
        }
//        redis验证
        String userJson = redisTemplate.opsForValue().get("TOKEN_" + token);
        if(StringUtils.isBlank(userJson)){
            return null;
        }
//        进行解析,获取user对象
        SysUser sysUser = JSON.parseObject(userJson, SysUser.class);
        return sysUser;
    }
退出登录
  1. 根据文档可以得知请求地址、请求方式、请求参数
  2. 思考:后端如何实现退出?
  • 其实后端实现退出只需要在redis中将这个token信息删除即可。

LogoutController

  • 为什么要使用loginService?
    • 其实登录和退出只是在接口不一样,service是可以实现共享的
@RestController
@RequestMapping("logout")
public class LogoutController {

    @Autowired
    private LoginService loginService;

    @GetMapping
    public Result logout(@RequestHeader("Authorization") String token){
        return loginService.logout(token);
    }
}

LoginService

//退出
    Result logout(String token);

LoginServiceImpl

@Override
    public Result logout(String token) {
        redisTemplate.delete("TOKEN_"+token);
        return Result.success(null);
    }