ThreadLocal - 同一个线程共享数据

  • 使用redis 保存 购物车数据
  • 引入redis 和Redis Seccsion
编辑拦截器
public class CartInterceptor implements HandlerInterceptor {}}
public static ThreadLocal<UserInfoTo> toThreadLocal = new ThreadLocal<>();
UserInfoTo userInfoTo = CartInterceptor.toThreadLocal.get(); //快速得到信息

返回值 是null 应该添加匹配值拦截器
@Configuration
public class GulimallWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CartInterceptor())//注册拦添加截器
                .addPathPatterns("/**");//所有请求
    }
}

CartInterceptor 拦截器

  • 在执行目标方法之前,判断用户的登录状态.并封装传递给controller目标请求
public class CartInterceptor implements HandlerInterceptor {

    // ThreadLocal同一个线程共享数据
    public static ThreadLocal<UserInfoTo> toThreadLocal = new ThreadLocal<>();

    /**
     * 目标方法执行之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        UserInfoTo userInfoTo = new UserInfoTo();
        HttpSession session = request.getSession();
        //获得当前登录用户的信息
        MemberRespVo member = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGINUSER);
        if (member != null) {
            //用户登录了
            userInfoTo.setUserId(member.getId());
        }
        //获取 cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                //user-key
                String name = cookie.getName();
                if (name.equals(CartConstant.TEMP_USER_COOKIE_NAME)) {
                    userInfoTo.setUserKey(cookie.getValue());
                    //标记为已是临时用户
                    userInfoTo.setTempUser(true);
                }
            }
        }
        //如果没有临时用户一定分配一个临时用户
        if (StringUtils.isEmpty(userInfoTo.getUserKey())) {
            String uuid = UUID.randomUUID().toString();
            userInfoTo.setUserKey(uuid);
        }
        //目标方法执行之前 吧信息放进去
        toThreadLocal.set(userInfoTo);
        return true;
    }
    

    /**
     * 业务执行之后,分配临时用户来浏览器保存
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {

        //获取当前用户的值
        UserInfoTo userInfoTo = toThreadLocal.get();
        //如果没有临时用户一定保存一个临时用户

        if (!userInfoTo.getTempUser()) {
            //创建一个cookie
            Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, userInfoTo.getUserKey());
            //扩大作用域
            cookie.setDomain("gulimall.com");
            //设置过期时间
            cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIMEOUT);
            response.addCookie(cookie);
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {

    }
}