在完成添加商品功能后,进行前端测试,可是出现user_id is null的报错,进行debug后发现,在
ShoppingCartServiceImpl类下的add()方法中的
Long userId = BaseContext.getCurrentId();//用户id
获取到的userId为空值,BaseContext利用TheadLocal原理实现获取用户ID,简单来说就是设置一个拦截器,拦截用户进程,进而获取用户的ID,所以获取的userId为空,一定就是我们的拦截器出来一下问题,只需要在
package com.sky.interceptor类中的
preHandle方法中添加
BaseContext.setCurrentId(userId)代码就可以实现了,也可能是我们在之前的视频中漏写进去的代码,或个思路想想,Long userId = BaseContext.getCurrentId();//用户id 我们只get ID,并未set ID就可以相同了,源代码如下
package com.sky.interceptor; import com.fasterxml.jackson.databind.ser.Serializers; import com.sky.constant.JwtClaimsConstant; import com.sky.context.BaseContext; import com.sky.properties.JwtProperties; import com.sky.utils.JwtUtil; import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * jwt令牌校验的拦截器 */ @Component @Slf4j public class JwtTokenUserInterceptor implements HandlerInterceptor { @Autowired private JwtProperties jwtProperties; /** * 校验jwt * * @param request * @param response * @param handler * @return * @throws Exception */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判断当前拦截到的是Controller的方法还是其他资源 if (!(handler instanceof HandlerMethod)) { //当前拦截到的不是动态方法,直接放行 return true; } //1、从请求头中获取令牌 String token = request.getHeader(jwtProperties.getUserTokenName()); //2、校验令牌 try { log.info("jwt校验:{}", token); Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token); Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString()); log.info("当前用户id:{}", userId); BaseContext.setCurrentId(userId); //3、通过,放行 return true; } catch (Exception ex) { //4、不通过,响应401状态码 response.setStatus(401); return false; } } }