public class CartInterceptor implements HandlerInterceptor {
// ThreadLocal 同一线程共享数据
public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();
TEMP_USER_COOKIE_NAME="ebao-user-key";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//UserInfoTo()对象 有userId,userKey,isTemp。
//从session获取用户信息
User user=session.getUser();
if (user!= null) {
// 用户登录了
userInfoTo.setUserId(memberRespVo.getId());
}
// 判断当前浏览器中的cookie中是否存在临时用户的标识的cookie
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if (name.equals(CartConstant.TEMP_USER_COOKIE_NAME)) {
//有临时用户把cookie里的uuid给他,并标识为临时用户
UserInfoTo.userKey(cookie.getValue());
UserInfoTo.isTemp(true); // 设置辨别是否有临时用户的boolean字段
}
}
}
// 如果没有临时用户,则系统自动分配一个
if (StringUtils.isEmpty(UserInfoTo.userKey)) {
String uuid = UUID.randomUUID().toString();
userInfoTo.userKey(uuid);
}
// 把封装的用户信息放到ThreadLocal
threadLocal.set(userInfoTo);
return true;
}
/**
* 目标方法执行之后 - 把分配的临时用户添加到cookie
* @param request
* @param response
* @param handler
* @param modelAndView
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// TODO cookie过期修改TempUser状态
UserInfoTo userInfoTo = threadLocal.get();
if (!userInfoTo.isTempUser()) { // 如果没有临时用户才需要添加cookie
Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, UserInfoTo.userKey());
cookie.setDomain("ebao.com");
cookie.setMaxAge(1个月);
response.addCookie(cookie);
}
}
}
购物车Redis数据结构Hash
cart:1{"sku1":{"name":商品1,"price":200}}
// 判断用户是否登陆了
if (userInfoTo.getUserId() != null) {
// 登录了,获取登录用户的购物车和临时购物车进行合并
// 1、判断临时购物车是否有数据
// 临时购物车有数据,进行合并
// 合并完成 清除临时购物车数据
clearCart(tempCartKey);
}
// 2、合并后,再获取登录后用户的购物车
List<CartItem> cartItems = getCartItems(cartKey);
cart.setItems(cartItems);
} else {
// 未登录 获取临时购物车所有购物项
}
网友评论