cookie技术的实现

一、购物车的cookie技术,有四条分支的操作,如下图:

在这里插入图片描述

二、 标题cookie和session的区别(Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。):

Cookie:给客户端们颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。
Session:就是通过检查服务器上的“客户明细表”来确认客户身份,Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
在这里插入图片描述

三、这里要商品的详细页面,要跳转到购物车,需要改一下bug,修改为quantity,因为我的web前端定义接收参数为quantity!!!

在这里插入图片描述

四、web前端代码如下:

实现cookie基本步骤:
1、接收前端传递过来的skuId和添加数量
2、去sku服务层查询sku基本信息
3、创建订单对象,把sku基本信息set过去
4、判断用户是否登录
5、总体业务逻辑:

if(未登陆)
  创建列表
  先获取购物车cookie
If(cookie==null)
  直接add进列表
else
  把cookie的json字符串转为java的列表
  遍历cookie的列表和用户点击的商品是否相同
If(相同)
  更新购物车的商品数量
else
  直接add进列表
  cookie的覆盖操作(列表转json存入cookie)
else(登录)
  查询skuId是否被该用户memberId添加
	if为空
		该用户未添加这skuid商品
	else
		该用户已添加过该skuid商品,需要更新添加该商品的数量
	同步缓存
@Controller
public class CartController {

    @Reference
    SkuService skuService;

    @Reference
    CartService cartService;


    @RequestMapping("addToCart")
    public String addToCart(String skuId, int quantity, HttpServletRequest request, HttpServletResponse response){

        //调用商品服务查询商品信息
        PmsSkuInfo skuInfo = skuService.getSkuById(skuId, "");

        //将商品信息封装成购物车信息
        OmsCartItem omsCartItem = new OmsCartItem();
        omsCartItem.setCreateDate(new Date());  //订单创建日期
        omsCartItem.setProductSkuId(skuId);  //sku的id
        omsCartItem.setQuantity(quantity);  //sku添加的数目

        //需要调用sku服务查询
        omsCartItem.setProductName(skuInfo.getSkuName());//sku的名称
        omsCartItem.setProductPic(skuInfo.getSkuDefaultImg());  //sku主图
        omsCartItem.setProductId(skuInfo.getProductId());//spu的id
        omsCartItem.setProductCategoryId(skuInfo.getCatalog3Id());//三级分类id
        omsCartItem.setPrice(skuInfo.getPrice());//sku商品价格

        //判断用户是否登录
        String memberId = "";

        //用户没有登录(memberId为空)
        if(StringUtils.isBlank(memberId)) {

            List<OmsCartItem> omsCartItemList = new ArrayList<>();   //创建购物车列表

            //先获取购物车的cookie
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);

            if(StringUtils.isBlank(cartListCookie)){     //如果cookie为空

                omsCartItemList.add(omsCartItem);   //把购物车对象add进去
            }else{     //如果cookie不为空

                omsCartItemList = JSON.parseArray(cartListCookie, OmsCartItem.class);  //把获取的cookie的json字符串列表,以购物车映射对象转换为java的列表

                boolean exit = judge_cart_exit(omsCartItem,omsCartItemList);   //用户添加的商品在cookie中存在,则为true

                if(exit==false){    //为false,用户添加的商品在cookie中不存在,直接把商品add进列表,保存到cookie即可!

                    omsCartItemList.add(omsCartItem);
                }


            }
            //覆盖cookie
            CookieUtil.setCookie(request,response,"cartListCookie", JSON.toJSONString(omsCartItemList),60*60*72,true);
        }else{

            //用户已经登陆,从db查询购物车数据
            OmsCartItem omsCartItemFromDb = cartService.ifCartExistByUser(memberId,skuId);

            //不需要查询该用户的购物车集合,只需要查询skuId是否被该用户memberId添加即可!
            //如果为空,则未添加
            if(omsCartItemFromDb == null){
                //当前memberId用户没有添加过当前skuId的商品
                omsCartItem.setMemberId(memberId);
                cartService.addCart(omsCartItem);

            }else {
                //当前memberId用户添加过当前skuId的商品
                omsCartItemFromDb.setQuantity(omsCartItem.getQuantity());
                cartService.updateCart(omsCartItemFromDb);
            }

            //同步缓存
            cartService.flushCartCache(memberId);


        }


        return "redirect:/success.html";   //redirect重定向的意思,返回一个路径的页面
    }


    private boolean judge_cart_exit(OmsCartItem omsCartItem, List<OmsCartItem> omsCartItemList) {

        boolean a = false;

        for (OmsCartItem Item : omsCartItemList) {     //遍历浏览器原本存储的cookie的商品列表

            String productSkuId = Item.getProductSkuId();

            if(productSkuId.equals(omsCartItem.getProductSkuId())){     //如果原本存储的cookie的商品,和用户点击的商品的id相同
                Item.setQuantity(omsCartItem.getQuantity()+Item.getQuantity());   //更新商品的商品数量(用户添加的数量+原本cookie存储数量)
                a = true;   //用户添加的商品在cookie中存在,则为true
            }
        }


        return a;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值