https://blog.csdn.net/u012878380/article/details/54170238
如果大家不知道我下面说的redis-cookie单点登录,那么请看我的上篇文章基于cookie-redis实现的单点登录点击打开链接。
购物车实现原理
利用上篇所讲的cookie-redis中的用户信息中的username来作为reids中的key,value来存储用户的信息。
细说
要想将物品加入购物车那么必定要先登录之后才能加入购物车,因为我们 需要cookie中存放的用户的name(为什么不能用uuid作为key那,因为用户每次登录的时候uuid都是不一样的那么必定会使用户加入购物车的商品不复存在 )。所以我们需要首先进行拦截
- package com.chenfeng.ego.portal.interceptro;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
- import com.smallming.commons.util.CookieUtils;
- import com.smallming.commons.util.HttpClientUtil;
- import com.smallming.commons.util.JsonUtils;
- import com.smallming.ego.pojo.TbUser;
- public class CartInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception {
- System.out.println("执行了拦截器");
- try {
- //如果用户没有登录跳转到登录页面
- String cookieValue = CookieUtils.getCookieValue(request, "TT_TOKEN");
- if(cookieValue!=null&&!cookieValue.equals("")){
- //还可以向redis取内容
- Map<String,String> param = new HashMap<>();
- param.put("callback","abc");
- String result = HttpClientUtil.doPost("http://localhost:8084/user/token/"+cookieValue,param);
- String userinfo = result.substring(result.indexOf("{")+1,result.lastIndexOf("}"));
- if(userinfo.trim().length()>0){
- TbUser user = JsonUtils.jsonToPojo(userinfo, TbUser.class);
- return true;
- }
- }
- response.sendRedirect("http://localhost:8084/user/showLogin");
- //如果用户已经登录放行.
- return false;
- } catch (Exception e) {
- e.printStackTrace();
- response.sendRedirect("http://localhost:8084/user/showLogin");
- return false;
- }
- }
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- }
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- }
- }
当用户登录之后他得用户信息就会被保存下来,我们就可以将用户的username(单点登录的时候将用户对象封装到字符串中放到redis中)取出来(将封装的用户的字符串转换 成对象)作为redis的key,商品的信息作为value存放在redis中下面是代码示例
- package com.chenfeng.ego.portal.service.impl;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.annotation.Resource;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.http.client.utils.HttpClientUtils;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Service;
- import com.chenfeng.ego.commons.util.CookieUtils;
- import com.chenfeng.ego.commons.util.HttpClientUtil;
- import com.chenfeng.ego.commons.util.JsonUtils;
- import com.chenfeng.ego.pojo.TbItem;
- import com.chenfeng.ego.pojo.TbUser;
- import com.chenfeng.ego.portal.dao.JedisDao;
- import com.chenfeng.ego.portal.pojo.TbItemImages;
- import com.chenfeng.ego.portal.service.CarService;
- @Service
- public class TbCarServiceImpl implements CarService
- {
- @Resource
- private JedisDao dao;
- @Value("${itemDetailUrl}")
- private String url;
- @Value("${getUserInfoUrl}")
- private String getUserInfoUrl;
- @Override
- //购物车第一步先判断cookie传递过来的值car+取出的redis里面的存储的字符串转化的对象的username(username唯一)
- //然后判断redis是否存在
- //如果不存在的话就创建一个购物车存放在redis中 key为car+username
- //每次进入这个service存储在redis中的字符串的num要进行+ 1操作
- public List<TbItemImages> addCare(long id,HttpServletRequest request,HttpServletResponse respone)
- {
- //不能用car+uuid因为每次登陆uuid是会变化的所以用不变的就是username
- String userinfo = dao.get("user-"+CookieUtils.getCookieValue(request, "TT_TOKEN")) ;
- //获取用户的名字
- String key = "cart-" + JsonUtils.jsonToPojo(userinfo, TbUser.class).getUsername();
- //判断是否有购物车
- if(dao.exists(key))
- {
- //若果存在的话 判断集合中是否存在该商品
- String redisResult = dao.get(key);
- List<TbItemImages> list = JsonUtils.jsonToList(redisResult, TbItemImages.class);
- boolean isExist = false;
- //循环判断改id是否存在如果存在的话num+1
- for(TbItemImages tbItemImages : list)
- {
- if(tbItemImages.getId()==id)
- {
- isExist = true;
- tbItemImages.setNum(tbItemImages.getNum()+1);
- break;
- }
- }
- //如果购物车存在但是id不存在就重新添加一个并重新set进去
- if(!isExist)
- {
- Map<String,String> map = new HashMap<>();
- map.put("id", id+"");
- String result = HttpClientUtil.doPost(url, map);
- TbItemImages tbItem = JsonUtils.jsonToPojo(result, TbItemImages.class);
- //第一次创建购物车时将物品设置为1
- tbItem.setNum(1);
- tbItem.setImages(tbItem.getImages()==null||"".equals("")?new String[0]:tbItem.getImage().split(","));
- list.add(tbItem);
- }
- dao.set(key, JsonUtils.objectToJson(list));
- return list;
- }else
- //没有key表示没有购物车 将购物车装到redis中
- {
- Map<String,String> map = new HashMap<>();
- map.put("id", id+"");
- String result = HttpClientUtil.doPost(url, map);
- TbItemImages tbItem = JsonUtils.jsonToPojo(result, TbItemImages.class);
- //第一次创建购物车时将物品设置为1
- tbItem.setNum(1);
- tbItem.setImages(tbItem.getImages()==null||"".equals("")?new String[0]:tbItem.getImage().split(","));
- List<TbItemImages> list = new ArrayList<>();
- list.add(tbItem);
- dao.set(key, JsonUtils.objectToJson(list));
- return list;
- }
- }
- @Override
- //查询购物车中的商品 利用tttoken获得redis里面的对象在获得其username
- public List<TbItemImages> selCart(HttpServletRequest req)
- {
- String userInfo = dao.get("user-"+CookieUtils.getCookieValue(req, "TT_TOKEN"));
- String key = "cart-"+ JsonUtils.jsonToPojo(userInfo, TbUser.class).getUsername();
- Boolean exits = dao.exists(key);
- if(exits)
- {
- return JsonUtils.jsonToList(dao.get(key),TbItemImages.class);
- }
- return new ArrayList<TbItemImages>();
- }
- //更新购物车里面的商品数目
- @Override
- public int UpdatNum(long id, String num, HttpServletRequest req)
- {
- int number = 0;
- if(num.endsWith(".action"))
- {
- number = Integer.parseInt(num.substring(0, num.indexOf(".")));
- }else
- {
- number = Integer.parseInt(num);
- }
- String userInfo = dao.get("user-"+CookieUtils.getCookieValue(req, "TT_TOKEN"));
- String key = "cart-"+ JsonUtils.jsonToPojo(userInfo, TbUser.class).getUsername();
- String result = dao.get(key);
- List<TbItemImages> list = JsonUtils.jsonToList(result,TbItemImages.class);
- for (TbItemImages tbItemImages : list)
- {
- if(id==tbItemImages.getId())
- {
- tbItemImages.setNum(number);
- break;
- }
- }
- String set = dao.set(key, JsonUtils.objectToJson(list));
- if(set.equals("OK"))
- {
- return 1;
- }
- return 0;
- }
- }