使用线程本地变量 和拦截器实现PassengerService类中会员id设置:
passenger.setMemberId(LoginMemberContext.getId());
在common中创建MemberLoginResp类 因为MemberLoginResp类经常用到所有放着公共中:
public class MemberLoginResp { private Long id; private String mobile; private String token; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } @Override public String toString() { final StringBuffer sb = new StringBuffer("MemberLoginResp{"); sb.append("id=").append(id); sb.append(", mobile='").append(mobile).append('\''); sb.append(", token='").append(token).append('\''); sb.append('}'); return sb.toString(); } }
创建线程本地变量:
public class LoginMemberContext { private static final Logger LOG = LoggerFactory.getLogger(LoginMemberContext.class); //线程本地变量 private static ThreadLocal<MemberLoginResp> member = new ThreadLocal<>(); public static MemberLoginResp getMember() { return member.get(); } public static void setMember(MemberLoginResp member) { LoginMemberContext.member.set(member); } public static Long getId() { try { return member.get().getId(); } catch (Exception e) { LOG.error("获取登录会员信息异常", e); throw e; } } }
在common中创建Member拦截器:
@Component public class MemberInterceptor implements HandlerInterceptor { private static final Logger LOG = LoggerFactory.getLogger(MemberInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { LOG.info("MemberInterceptor开始"); //获取header的token参数 String token = request.getHeader("token"); if (StrUtil.isNotBlank(token)) { LOG.info("获取会员登录token:{}", token); JSONObject loginMember = JwtUtil.getJSONObject(token); LOG.info("当前登录会员:{}", loginMember); MemberLoginResp member = JSONUtil.toBean(loginMember, MemberLoginResp.class); LoginMemberContext.setMember(member); } LOG.info("MemberInterceptor结束"); return true; } }
创建日志拦截器:
@Component public class LogInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 增加日志流水号 MDC.put("LOG_ID", System.currentTimeMillis() + RandomUtil.randomString(3)); return true; } }
在member模块中创建SpringMvcConfig类 添加上MemberInterceptor拦截器:
并且加上日志拦截器
@Configuration public class SpringMvcConfig implements WebMvcConfigurer { @Resource LogInterceptor logInterceptor; @Resource MemberInterceptor memberInterceptor; // 添加一个拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { // 日志拦截器要放最前面执行 registry.addInterceptor(logInterceptor); // 路径不要包含context-path、 // 加入memberInterceptor拦截器 registry.addInterceptor(memberInterceptor) // 正则表达式:针对所有请求接口生效 .addPathPatterns("/**") // 排除掉的路径 就是不拦截 .excludePathPatterns( "/hello", "/member/send-code", "/member/login" ); } }
在PassengerService 服务层使用线程本地变量添加MemberId:
@Service public class PassengerService { @Resource private PassengerMapper passengerMapper; public void save(PassengerSaveReq req){ DateTime now = DateTime.now(); Passenger passenger = BeanUtil.copyProperties(req, Passenger.class); passenger.setMemberId(LoginMemberContext.getId()); passenger.setId(SnowUtil.getSnowflakeNextId()); passenger.setCreateTime(now); passenger.setUpdateTime(now); passengerMapper.insert(passenger); } }