如果大家不知道我下面说的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;
	}
}