编程校验token有效性

该博客介绍了如何在大型项目中优化Token验证过程,通过编写程序集中处理Token的有效性检查,避免在每个接口中重复验证。内容包括从HttpServletRequest中获取Token,校验Token是否为空,解密获取用户名并验证,查询用户信息,以及检查Token是否超时。此外,还实现了Token的刷新机制,确保用户在线操作的连续性,并设置了Token的缓存过期时间。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

每次访问接口的时候都需要验证传递token的有效性,常规的办法就是在每个接口中判断token的有效性,但是如果在较大的项目中有太多接口的情况下,每次都进行token的校验会太过麻烦。所以写出程序进行编程校验token有效性。

首先,获取request中传递的token

public class TokenUtils {
    public static String getTokenByRequest(HttpServletRequest request) {
        String token = request.getParameter("token");
        if (token == null) {
            token = request.getHeader("X-Access-Token");
        }
        return token;
    }

对token进行验证,其中token内容不能为空。解密获得username,用于和数据库进行对比,判断token是否有效。之后查询用户信息,如果用户信息不存在则报错。最后校验token是否超时失效 & 或者账号密码是否错误

public static boolean verifyToken(HttpServletRequest request, ISysBaseAPI sysBaseAPI, RedisUtil redisUtil) {
        log.info(" -- url --" + request.getRequestURL());
        String token = getTokenByRequest(request);

        if (StringUtils.isBlank(token)) {
            throw new AuthenticationException("token不能为空!");
        }

        String username = JwtUtil.getUsername(token);
        if (username == null) {
            throw new AuthenticationException("token非法无效!");
        }

        LoginUser user = sysBaseAPI.getUserByName(username);
        if (user == null) {
            throw new AuthenticationException("用户不存在!");
        }
        if (user.getStatus() != 1) {
            throw new AuthenticationException("账号已被锁定,请联系管理员!");
        }
                if (!jwtTokenRefresh(token, username, user.getPassword(), redisUtil)) {
            throw new AuthenticationException("Token失效,请重新登录!");
        }
        return true;
    }

刷新token,保证用户在线操作不掉线;之后校验token有效性;设置Toekn缓存有效时间。在for循环中解决每次请求,都重写redis中 token缓存问题

private static boolean jwtTokenRefresh(String token, String userName, String passWord, RedisUtil redisUtil) {
        String acheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));
        if (oConvertUtils.isNotEmpty(cacheToken)) {
            if (!JwtUtil.verify(cacheToken, userName, passWord)) {
                String newAuthorization = JwtUtil.sign(userName, passWord);
                 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization);
                redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000);
            }
            
            return true;
        }
        return false;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值