ToB企服应用市场:ToB评测及商务社交产业平台
标题:
解决 碰到JWT中claims中获取不到数据的问题
[打印本页]
作者:
梦应逍遥
时间:
2024-10-8 06:06
标题:
解决 碰到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()获取,而且还成功了,不知道为什么突然不可了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4