添加购物车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");