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企服之家,中国第一个企服评测及商务社交产业平台。 |