自学内容网 自学内容网

解决 遇到JWT中claims中获取不到数据的问题

1.先介绍一下JWT的常规流程

用户进行登录将token储存到redis,然后进行其他需要验证的操作时进行验证,比如使用拦截器进行验证,那么id存储的到claims,因为可以在拦截器验证时将其存放到ThreadLocal中,这样通过ThreadLocal直接获取用户的id,不用再担心前端误传其他的用户id,便于后端进行操作。

2.Bug出现的地方和解决方式

修改Bug后的拦截器代码块:

@Component
public class LoginInterceptor implements HandlerInterceptor {
 
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
        String token = request.getHeader("Authorization");
 
        try{

            String redisToken  = (String) redisTemplate.opsForValue().get(RedisConstant.USER_TOKEN_PREFIX+token);
            if (redisToken == null){
                throw new BusinessRuntimeException(ResultCodeEnum.SIGN_OVERDUE);
            }
 
            Claims claims = JwtUtils.parseJWT(token);
            Long userId = claims.get("id",Long.class);

            //把业务数据存储到ThreadLocal中
            UserHolder.setUserId(userId);
 
            return true;
        }catch (Exception e){
            response.setStatus(401);
            return false;
        }
 
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //清空ThreadLocal中的数据
        UserHolder.removeUserId();
    }
}

从上图可以发现我使用的是claims.get("id",.Long.Class)获取存入的用户id;

而不是通过claims.getId()获取,如果通过claims.getId()获取,通过Debug发现得到的值是null

我记得我之前都是通过claims.getId()获取,而且还成功了,不知道为什么突然不行了。


原文地址:https://blog.csdn.net/qq_69183322/article/details/142703839

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!