public class CartInterceptor implements HandlerInterceptor {
// ThreadLocal 同一線程共享數(shù)據(jù)
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字段
}
}
}
// 如果沒有臨時用戶,則系統(tǒng)自動分配一個
if (StringUtils.isEmpty(UserInfoTo.userKey)) {
String uuid = UUID.randomUUID().toString();
userInfoTo.userKey(uuid);
}
// 把封裝的用戶信息放到ThreadLocal
threadLocal.set(userInfoTo);
return true;
}
/**
* 目標方法執(zhí)行之后 - 把分配的臨時用戶添加到cookie
* @param request
* @param response
* @param handler
* @param modelAndView
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// TODO cookie過期修改TempUser狀態(tài)
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數(shù)據(jù)結構Hash
cart:1{"sku1":{"name":商品1,"price":200}}
// 判斷用戶是否登陸了
if (userInfoTo.getUserId() != null) {
// 登錄了,獲取登錄用戶的購物車和臨時購物車進行合并
// 1、判斷臨時購物車是否有數(shù)據(jù)
// 臨時購物車有數(shù)據(jù),進行合并
// 合并完成 清除臨時購物車數(shù)據(jù)
clearCart(tempCartKey);
}
// 2、合并后,再獲取登錄后用戶的購物車
List<CartItem> cartItems = getCartItems(cartKey);
cart.setItems(cartItems);
} else {
// 未登錄 獲取臨時購物車所有購物項
}