ssm+redis+cookie购物车思想(游客,登录)1.0版本

本文详细介绍了在电商网站中实现购物车添加功能的具体逻辑,包括针对登录与非登录用户的购物车处理方式,使用cookie和Redis存储商品信息的方法,以及如何通过Ajax请求实现前端与后端的交互。

添加购物车JSP页面发起ajax请求

function addShop(id){
		$.ajax({
			type:"post",
			url:"${pageContext.request.contextPath}/shop/addShop?goodsId="+id,
			success:function(data){
				   if(data=='1'){
					alert("添加进购物车成功!");
				   }else if(data=='2'){
					   alert("你已经添加过该商品")
				   }
				}
		});
	}	

添加商品进购物车,传进来(商品ID)

购物车逻辑:对于登录用户来说,可以使用服务端进行存储(redis key:用户Id value:序列化存储)。

对于非登录来说:游客来说,让客户端自己存储(本地存储的[cookie存储《只能存储字符串,value中不能包含中文空格》],js当中的有一个sessionStorage)。

首先判断用户是否登录

	**使用Redistemplate.hasKay()判断**
boolean isLogin=jedis.hasKey("session:"+request.getRemoteAddr());

!!!情况一!!!用户没有登录使用cookie存储,先把所有的cookie取到,判断是不是第一次保存购物车

			//使用cookie来进行存储
			//取到请求当中携带的cookie
			Cookie[] cookies=request.getCookies();
			
			Cookie shopCookie=null;
			for(Cookie cookie:cookies) {
				//判断用户之前有没有存储过购物车
				if(cookie.getName().equals("shop")) {
				
					shopCookie=cookie;
					break;
				}
			}

用户第一次购物,需要购物车, (key:shop value:字符串【json】)这里使用List集合存储,将List集合转成json
那么问题来了,cookie不允许出现中文或特殊字符,使用URLEncoder.encode(json, “utf-8”);进行编码,之后设置cookie的生命周期,设置项目路径(代表,访问哪个携带cookie),之后把cookie相应给cookie.

			//用户第一次需要存购物车
			    //key shop   value  字符串   json
				Goods goods=goodsService.findGoodsById(goodsId);
				List<Goods> goodsList=new ArrayList();
				goodsList.add(goods);
				//将商品集合转成json
				String json=JSON.toJSONString(goodsList);
				//cookie当中是不准许出现中文或特殊字符的
				String key="shop";
				String value=URLEncoder.encode(json, "utf-8");
				Cookie cookie=new Cookie(key,value);
				//设置cookie的生命周期
				cookie.setMaxAge(60*60*24);
				cookie.setPath(request.getContextPath());
				response.addCookie(cookie);
				response.getWriter().write("1");

用户之前购物车是有东西的,取出json(cookie.getValue),重新解码URLDecoder.decode(json, “utf-8”);将json转成List(JSON.parseArray(json, Goods.class)?,循环判断一下 该商品是不是购买过。

// 用户之前购物车是有东西的
				String json = shopCookie.getValue();
				json = URLDecoder.decode(json, "utf-8");
				List<Goods> goodsList = JSON.parseArray(json, Goods.class);
				boolean isExist = false;
				for (Goods goods : goodsList) {
					if (goods.getId() == goodsId) {
						isExist = true;
						break;
					}
				}
				if (isExist) {
					response.getWriter().write("2");
				} else {
					Goods goods = goodsService.findGoodsById(goodsId);
					goodsList.add(goods);
					// 将商品集合转成json
					String json1 = JSON.toJSONString(goodsList);
					// cookie当中是不准许出现中文或特殊字符的
					String key = "shop";
					String value = URLEncoder.encode(json1, "utf-8");
					Cookie cookie = new Cookie(key, value);
					// 设置cookie的生命周期
					cookie.setMaxAge(60 * 60 * 24);
					cookie.setPath(request.getContextPath());
					response.addCookie(cookie);
					response.getWriter().write("1");

				}

!!!情况二!!!用户登录使用redis存储判断商品是不是第一次购买,需要用户Id
取User,获取用户购物车(key[shop+id])

byte[] bytes = (byte[]) jedis.boundValueOps("session:" + request.getRemoteAddr()).get();
			User user = (User) jedis.getHashValueSerializer().deserialize(bytes);

用户之前存过商品判断是不是同一件商品

		byte[] data = (byte[]) jedis.boundValueOps("shop:" + user.getId()).get();
				List<Goods> goodsList = (List<Goods>) jedis.getHashValueSerializer().deserialize(data);
				boolean isGoods = false;
				for (Goods goods : goodsList) {
					if (goods.getId() == goodsId) {
						isGoods = true;
						break;
					}
				}

用户不是第一次存

response.getWriter().write("2");

用户第一次需要存购物车,把List序列化一下,存到redis中。

				// 用户第一次需要存购物车
				Goods goods = goodsService.findGoodsById(goodsId);
				List<Goods> goodsList = new ArrayList();
				goodsList.add(goods);
				byte[] data = jedis.getHashValueSerializer().serialize(goodsList);
				jedis.boundValueOps("shop:" + user.getId()).set(data);
				response.getWriter().write("1");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值