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

打印 上一主题 下一主题

主题 386|帖子 386|积分 1158



1.先先容一下JWT的常规流程

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

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

修改Bug后的拦截器代码块:
  1. @Component
  2. public class LoginInterceptor implements HandlerInterceptor {
  3.     @Autowired
  4.     private RedisTemplate<String,Object> redisTemplate;
  5.     @Override
  6.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  7.         String token = request.getHeader("Authorization");
  8.         try{
  9.             String redisToken  = (String) redisTemplate.opsForValue().get(RedisConstant.USER_TOKEN_PREFIX+token);
  10.             if (redisToken == null){
  11.                 throw new BusinessRuntimeException(ResultCodeEnum.SIGN_OVERDUE);
  12.             }
  13.             Claims claims = JwtUtils.parseJWT(token);
  14.             Long userId = claims.get("id",Long.class);
  15.             //把业务数据存储到ThreadLocal中
  16.             UserHolder.setUserId(userId);
  17.             return true;
  18.         }catch (Exception e){
  19.             response.setStatus(401);
  20.             return false;
  21.         }
  22.     }
  23.     @Override
  24.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  25.         //清空ThreadLocal中的数据
  26.         UserHolder.removeUserId();
  27.     }
  28. }
复制代码
从上图可以发现我使用的是claims.get("id",.Long.Class)获取存入的用户id;
而不是通过claims.getId()获取,如果通过claims.getId()获取,通过Debug发现得到的值是null
我记得我之前都是通过claims.getId()获取,而且还成功了,不知道为什么突然不可了。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表