public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ System.out.println('经过了拦截器-----------------------------------------------------------------------------------------------------------------------------------------------------------'); System.out.println('>>请求url - ' + request.getRequestURL());

Result result = new Result();//存放给前端返回数据

response.setCharacterEncoding('UTF-8');
response.setContentType('text/html; charset=utf-8');

Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements()){
    String paramName =  params.nextElement();
    System.out.println('>>Parameter Name - '+paramName+', Value - '+request.getParameter(paramName));
}

if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
    System.out.println('OPTIONS请求,放行');
    return true;
}

//无论如何都放行。具体能不能操作还是在具体操作中去判断
//拦截器只负责把请求头中包含token的令牌进行解析验证
String header = request.getHeader('Authorization');

if(StringUtils.isEmpty(header)){
    log.info('获取到的请求头为空!');
    result.setCode(-3);
    result.setMessage('获取到的请求头为空!');
    String json = JSONObject.toJSONString(result);
    returnJson(response,json);
    return false;
}

//如果有包含Authorization头信息,就对其进行解析
if(header.startsWith('Bearer ')){        
    //得到token
    String token =header.substring(7);

    if (StringUtils.isEmpty(token)){
        log.info('无token,请重新登陆!');
        result.setCode(-2);
        result.setMessage('无token,请重新登陆!');
        String json = JSONObject.toJSONString(result);
        returnJson(response,json);
        return false;
    }

    //对令牌进行验证
    try {
        Claims claims = JwtUtil.getTokenClaim(token);

        if (claims == null){
            log.info('token已经过期,请重新登录!');
            result.setCode(-2);
            result.setMessage('token已经过期,请重新登录!');
            String json = JSONObject.toJSONString(result);
            returnJson(response,json);
            return false;
        }

        String role = (String) claims.get('role');

        if(role != null && role.equals('1')){
            Superadmin superadmin = (Superadmin) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));

            if (superadmin == null){
                log.info('用户不存在!');
                result.setCode(-2);
                result.setMessage('用户不存在!请重新登录!');
                String json = JSONObject.toJSONString(result);
                returnJson(response,json);
                return false;
            }

            //false表示快过期
            if (jwtUtil.isExpired(token)){
                log.info('token已经过期,请重新登录!');
                result.setCode(-2);
                result.setMessage('token已经过期,请重新登录!');
                String json = JSONObject.toJSONString(result);
                returnJson(response,json);
                return false;

            }else if (jwtUtil.checkTokenIsUse(token)){
                log.info('token还有1分钟过期!重新生成token');

                //对数据进行加密
                String md5key = 'MRONE' + DigestUtils.md5Hex(superadmin + 'MRONE_PHONE_LOGIN');
                //把用户信息存入缓存
                String newRedis_token = 'newToken'+md5key;
                redisTemplate.opsForValue().set(newRedis_token,superadmin, Duration.ofDays(5));

                String newToken = jwtUtil.getTokenByExpire(newRedis_token,'1',jwtUtil.getExpire()*2);

                result.setCode(1);
                result.setMessage('token快过期,更换token!');
                result.setData(newToken);
                String json = JSONObject.toJSONString(result);
                returnJson(response,json);
                return false;
            }

            //权限验证
            request.setAttribute('claims_superadmin',token);

        }

        if(role != null && role.equals('2')){
            Admin admin = (Admin) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));

            if (admin == null){
                log.info('用户不存在!');
                result.setCode(-2);
                result.setMessage('用户不存在!请重新登录!');
                String json = JSONObject.toJSONString(result);
                returnJson(response,json);
                return false;
            }

            if (jwtUtil.isExpired(token)){
                log.info('token已经过期,请重新登录!');

                result.setCode(-2);
                result.setMessage('token已经过期,请重新登录!');
                String json = JSONObject.toJSONString(result);
                returnJson(response,json);
                return false;

            }else if (jwtUtil.checkTokenIsUse(token)){
                log.info('token将要过期!重新生成token');

                //对数据进行加密
                String md5key = 'MRONE' + DigestUtils.md5Hex(admin + 'MRONE_PHONE_LOGIN');
                //把用户信息存入缓存
                String newRedis_token = 'newToken'+md5key;
                redisTemplate.opsForValue().set(newRedis_token,admin, Duration.ofDays(5));

                String newToken = jwtUtil.getTokenByExpire(newRedis_token,'2',jwtUtil.getExpire()*2);
                log.info('新生成的newToken:'+newToken);

                redisTemplate.opsForValue().set(admin.getAdminId() + 'token', newToken, Duration.ofHours(2));

                result.setCode(1);
                result.setMessage('token快过期,更换token!');
                result.setData(newToken);
                String json = JSONObject.toJSONString(result);
                returnJson(response,json);

                return false;

            }

            request.setAttribute('claims_admin',token);

        }

        if(role != null && role.equals('3')){
            Coach coach = (Coach) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));

            if (coach != null){
                Coach coach1 = coachService.queryOneCoachByID(coach.getCoachId());

                if (coach1 == null){
                    log.info('用户不存在!');
                    result.setCode(-2);
                    result.setMessage('用户不存在!请重新登录!');
                    String json = JSONObject.toJSONString(result);
                    returnJson(response,json);
                    return false;
                }

                //true表示过期
                if (jwtUtil.isExpired(token)){
                    log.info('token已经过期,请重新登录!');
                    result.setCode(-2);
                    result.setMessage('token已经过期,请重新登录!');
                    String json = JSONObject.toJSONString(result);
                    returnJson(response,json);
                    return false;

                }else if (jwtUtil.checkTokenIsUse(token)){
                    log.info('token将要过期!重新生成token');

                    //对数据进行加密
                    String md5key = 'MRONE' + DigestUtils.md5Hex(coach + 'MRONE_PHONE_LOGIN');
                    //把用户信息存入缓存
                    String newRedis_token = 'newToken'+md5key;
                    redisTemplate.opsForValue().set(newRedis_token,coach, Duration.ofDays(5));

                    String newToken = jwtUtil.getTokenByExpire(newRedis_token,'3',jwtUtil.getExpire()*2);

                    log.info('新生成的newToken:'+newToken);

                    result.setCode(1);
                    result.setMessage('token快过期,更换token!');
                    result.setData(newToken);
                    String json = JSONObject.toJSONString(result);
                    returnJson(response,json);
                    return false;
                }

            }

            request.setAttribute('claims_coach',token);
        }

        if(role != null && role.equals('4')){
            CarUser carUser = (CarUser) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));

            if (carUser != null){
                CarUser carUser1 = carUserService.queryOneCarUserById(carUser.getUserId());

                if (carUser1 == null){
                    log.info('用户不存在!');
                    result.setCode(-2);
                    result.setMessage('用户不存在!请重新登录!');
                    String json = JSONObject.toJSONString(result);
                    returnJson(response,json);
                    return false;
                }

                //true表示过期
                if (jwtUtil.isExpired(token)){
                    log.info('token已经过期,请重新登录!');
                    result.setCode(-2);
                    result.setMessage('token已经过期,请重新登录!');
                    String json = JSONObject.toJSONString(result);
                    returnJson(response,json);
                    return false;

                }else if (jwtUtil.checkTokenIsUse(token)){
                    log.info('token将要过期!重新生成token');

                    //对数据进行加密
                    String md5key = 'MRONE' + DigestUtils.md5Hex(carUser + 'MRONE_PHONE_LOGIN');
                    //把用户信息存入缓存
                    String newRedis_token = 'newToken'+md5key;
                    redisTemplate.opsForValue().set(newRedis_token,carUser, Duration.ofDays(5));

                    String newToken = jwtUtil.getTokenByExpire(newRedis_token,'4',jwtUtil.getExpire()*2);

                    log.info('新生成的newToken:'+newToken);

                    result.setCode(1);
                    result.setMessage('token快过期,更换token!');
                    result.setData(newToken);
                    String json = JSONObject.toJSONString(result);
                    returnJson(response,json);

                    return false;
                }

            }

            request.setAttribute('claims_user',token);
        }
    }catch (Exception e){
        log.info('拦截器中异常-----------------------'+e.getMessage());
        log.info('token已经过期,请重新登录!');
        result.setCode(-2);
        result.setMessage('token已经过期,请重新登录!');
        String json = JSONObject.toJSONString(result);
        returnJson(response,json);
        return false;
    }
}

long startTime = System.currentTimeMillis();
request.setAttribute('startTime', startTime);
return true;

}

SpringMVC 拦截器实现 JWT 认证和 token 刷新

原文地址: https://www.cveoy.top/t/topic/qnSd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录