这里的user_id是从拦截器里拦截的,但是之前没单独配置use_id的拦截器,要在src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java 路径下配置JwtTokenUserInterceptor.java这个文件,
package com.sky.interceptor; import com.sky.constant.JwtClaimsConstant; import com.sky.constant.MessageConstant; 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){ //判断当前拦截到的是Controller的方法还是其他资源 if (!(handler instanceof HandlerMethod)) { //当前拦截到的不是动态方法,直接放行 return true; } HandlerMethod handlerMethod= (HandlerMethod) handler; //1、从请求头中获取令牌 String token = request.getHeader(jwtProperties.getUserTokenName()); //2、校验令牌 try { log.info("jwt校验:{}", token); Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token); Long empId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString()); BaseContext.setCurrentId(empId); log.info("当前用户id:{}", empId); //3、通过,放行 return true; } catch (Exception ex) { //4、不通过,响应401状态码 log.error(MessageConstant.USER_NOT_LOGIN); response.setStatus(401); return false; } } }
配置完成之后还要去注册,注册文件的地址是
src/main/java/com/sky/config/WebMvcConfiguration.java
在如下地方添加,我已经添加好了,你可以看看差了哪些东西,记得自己要注入定义好的拦截器
就是要注入这个
@Autowired private JwtTokenUserInterceptor jwtTokenUserInterceptor;
这个是要添加的地方,用于注册拦截器
protected void addInterceptors(InterceptorRegistry registry) { log.info("开始注册自定义拦截器..."); registry.addInterceptor(jwtTokenAdminInterceptor) .addPathPatterns("/admin/**") .excludePathPatterns("/admin/employee/login"); registry.addInterceptor(jwtTokenUserInterceptor) .addPathPatterns("/user/**") .excludePathPatterns("/user/user/login"); log.info("开始注册自定义拦USER截器..."); }
如果都没问题,看看是不是这里出了问题com/sky/service/impl/ShoppingCartServiceImpl.java
这个文件下的
shoppingCart.setUserId(userId);
是不是写成了setId了