购物车实现

public class CartInterceptor implements HandlerInterceptor {

//    ThreadLocal 同一线程共享数据
    public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();
TEMP_USER_COOKIE_NAME="ebao-user-key";
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//UserInfoTo()对象 有userId,userKey,isTemp。
//从session获取用户信息
User user=session.getUser();

        if (user!= null) {
            // 用户登录了
            userInfoTo.setUserId(memberRespVo.getId());
        }

        //  判断当前浏览器中的cookie中是否存在临时用户的标识的cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if (name.equals(CartConstant.TEMP_USER_COOKIE_NAME)) {
            //有临时用户把cookie里的uuid给他,并标识为临时用户
                UserInfoTo.userKey(cookie.getValue());
                    UserInfoTo.isTemp(true); // 设置辨别是否有临时用户的boolean字段
                }
            }
        }

        // 如果没有临时用户,则系统自动分配一个
        if (StringUtils.isEmpty(UserInfoTo.userKey)) {
            String uuid = UUID.randomUUID().toString();
            userInfoTo.userKey(uuid);
        }
        // 把封装的用户信息放到ThreadLocal
        threadLocal.set(userInfoTo);
        return true;
    }

    /**
     * 目标方法执行之后 - 把分配的临时用户添加到cookie
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

        // TODO cookie过期修改TempUser状态
        UserInfoTo userInfoTo = threadLocal.get();
        if (!userInfoTo.isTempUser()) { // 如果没有临时用户才需要添加cookie
            Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, UserInfoTo.userKey());
            cookie.setDomain("ebao.com");
            cookie.setMaxAge(1个月);
            response.addCookie(cookie);
        }

    }
}
购物车Redis数据结构Hash
cart:1{"sku1":{"name":商品1,"price":200}}

  // 判断用户是否登陆了
     
        if (userInfoTo.getUserId() != null) {
            // 登录了,获取登录用户的购物车和临时购物车进行合并
    
            // 1、判断临时购物车是否有数据
          
                // 临时购物车有数据,进行合并
              
                // 合并完成 清除临时购物车数据
                clearCart(tempCartKey);
            }
            // 2、合并后,再获取登录后用户的购物车
            List<CartItem> cartItems = getCartItems(cartKey);
            cart.setItems(cartItems);

        } else {
            // 未登录 获取临时购物车所有购物项
         
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、主要分离线购物车和在线购物车(hash数据类型) 2、主要功能有(添加sku,删除,更新,合并,勾选购物项,排...
    hgfsrui阅读 5,626评论 1 0
  • 电商网站中购物车的实现有很多种方式,这里我介绍两种,第一种是直接用数据库,用户在一个会话期间的所有的对购物车的操作...
    拼搏男孩阅读 1,585评论 0 1
  • 分布式项目:根据业务 进行拆分处理速度变快,并发能力就提高了。 dao:数据层service:服务层web:表现层...
    BenjaminCool阅读 1,832评论 0 0
  • 目前我们使用购物车的存储方式主要有:Session方式,Cookie方式,数据库存储,我们来一一分析优缺点。1.S...
    转身一世琉璃白_4a57阅读 7,993评论 0 2
  • 购物车是每个商城类的app必备的实现功能,然而购物车模块实现起来并不简单,需要考虑的地方也比较多,当初我实现起来也...
    爱猫的仙生阅读 12,278评论 1 26

友情链接更多精彩内容