Bootstrap

token超时刷新策略

需求分析

我们在做用户中心时,对于登录用户签发其对应的token,对token设置他的固定有效期时间。我们通常会遇到一个这样的问题:在有效期内用户携带token访问没问题,当过了有效期后token失效,用户需要重新登录获取新的token。当token时间设置得很短,假如只有10分钟,那么用户当问期间每隔10分钟就要重新登录一次,这样对于用户来说是比较差的体验。

一个App鉴权流程(token刷新机制):

1.活跃的用户应该在无感知的情况下在token失效后获取到新的token,携带这个新的token进行访问,2.不活跃的用户在token失效后需要重新进行登录认证。。

设计思路

用户登录时,为登录用户签发JWT(Json Web Token),并设置JWT的有效时间,同时将该用户的JWT保存至redis缓存中,并设置缓存的有效期,缓存中保存的JWT的有效期要大于JWT本身的有效时间。其中:缓存时间-JWT有效时间=token可刷新时间

token超时刷新策略

Token登录流程

用户进行接口请求时,需要携带token,而此时进行接口请求时通常有以下几种状态:

  1. 未携带token传入:返回token为空,权限不足;
  2. 错误token传入:返回token错误,权限不足;
  3. 正常token传入:通过 。
  4. 正常token但已过期:查询redis中该token是否存在,如果缓存中存在则刷新token,并将刷新后的token重新放入redis,使用刷新后的token请求资源; 缓存中不存在,则token刷新期限已过,用户需重新登录。

登陆代码

public ResultDTO login(String name, String password) {
        Map<String, Object> tokenMap = new HashMap<>();
        String token = null;
        try {
            User user = userMapper.findByUsername(name);            //查询用户登录的账号是否存在
            if(user == null){
                 return ResultDTO.failure(new ResultError(UserError.EMP_IS_NULL_EXIT));
            }else{
                //校验用户密码是否正确
                if(!user.getPassword().equals(password)){
                    return ResultDTO.failure(new ResultError(UserError.PASSWORD_OR_NAME_IS_ERROR));
             
;