判断当前用户是否登陆,如果未登录采用 Cookie 存储,如果登录则采用 Redis 存储。登录后要进行 Cookie 购物车与 Redis 购物车的合并操作,并清除 Cookie 购物车。
获取当前登录人账号spring-security.xml 更改配置: 去掉
添加
access="IS_AUTHENTICATED_ANONYMOUSLY"
用于设置资源可以在不登陆时可以访问。
此 配 置 与 security="none"
的 区 别 在 于 当 用 户 未 登 陆 时 获 取 登 陆 人 账 号 的 值 为anonymousUser
,而 security="none"
的话,无论是否登陆都不能获取登录人账号的值。
代码实现: 在 pinyougou-cart-web 的 findCartList 和addGoodsToCartList 方法中,获取用户名
//得到登陆人账号,判断当前是否有人登陆
String username = SecurityContextHolder.getContext().getAuthentication().getName();
测试:当用户未登陆时,username 的值为anonymousUser
远程购物车存取 服务层接口pinyougou-cart-interface 中 CartService.java 定义方法
/**
* 需求:查询redis购物车数据
* @return
*/
List findRedisCartList(String username);
/**
* 把购物车列表保存到redis购物车
* @param cartList
* @param username
*/
void saveCartListToRedisCart(List cartList, String username);
服务层实现
pinyougou-cart-service 中 CartServiceImpl.java 实现方法
/**
* 需求:查询redis购物车数据
*
* @return
*/
public List findRedisCartList(String username) {
// 查询redis服务购物车列表
List cartList = (List) redisTemplate.boundHashOps(
"cartList").get(username);
// 判断查询购物车数据是否有值
if (cartList == null) {
return new ArrayList();
}
return cartList;
}
/**
* 把购物车列表保存到redis购物车
*
* @param cartList
* @param username
*/
public void saveCartListToRedisCart(List cartList, String username) {
// TODO Auto-generated method stub
redisTemplate.boundHashOps("cartList").put(username, cartList);
}
控制层
修改 CartController.java 的 findCartList 方法
/**
* 需求:查询购物车列表
*
* @return
*/
@RequestMapping("/findCartList")
public List findCartList(HttpServletRequest request) {
// 判断用户此时是否处于登录状态
// 获取用户名
String username = SecurityContextHolder.getContext()
.getAuthentication().getName();
//定义集合
List cartList = null;
// 查询cookie购物车数据
String cartListStr = CookieUtil.getCookieValue(request, "cartList", true);
// 登录
if (!username.equals("anonymousUser")) {
//登录
cartList = cartService.findRedisCartList(username);
return cartList;
}
//未登录
// 判断集合是否存在值
if (StringUtils.isBlank(cartListStr)) {
cartListStr = "[]";
}
// 把购物车字符串转换成对象
cartList = JSON.parseArray(cartListStr, Cart.class);
return cartList;
}
修改 addGoodsToCartList 方法
@RequestMapping("addGoodsToCartList")
@CrossOrigin(origins="http://item.pinyougou.com",allowCredentials="true")
public PygResult addGoodsToCartList(String itemId, Integer num,
HttpServletRequest request, HttpServletResponse response) {
try {
itemId = itemId.replace(",", "");
// 获取用户登录身份信息
String username = SecurityContextHolder.getContext()
.getAuthentication().getName();
// 查询购物车列表
List cartList = this.findCartList(request);
// 添加购物车
cartList = cartService.addGoodsToCartList(cartList, Long.parseLong(itemId), num);
// 判断用户是否处于登录状态
if (username.equals("anonymousUser")) {
// 未登录
CookieUtil.setCookie(request, response, "cartList",
JSON.toJSONString(cartList), 46800, true);
} else {
// 登录
cartService.saveCartListToRedisCart(cartList, username);
}
return new PygResult(true, "购物车添加成功");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return new PygResult(false, "购物车添加失败");
}
}
跳板页
(1)创建跳板页:pinyougou-cart-web 工程新建 login.html ,页面添加脚本
location.href="cart.html";
(2)购物车页面链接到跳板页
请登录
购物车合并
服务接口层
pinyougou-cart-interface 工程的 CartService.java 定义方法
/**
* 需求:合并购物车数据
* @param username
* @param cartListStr
*/
List mergeCart(String username, String cartListStr);
服务实现层
pinyougou-cart-service 工程 CartServiceImpl.java 实现方法
/**
* 需求:合并购物车数据
*
* @param username
* @param cartListStr
*/
public List mergeCart(String username, String cartListStr) {
// 根据用户名查询所有购物车数据
List cartList1 = (List) redisTemplate.boundHashOps("cartList").get(username);
// 把cookie购物车数据转换集合
List cartList2 = JSON.parseArray(cartListStr, Cart.class);
//循环redis购物车
for (Cart cart : cartList2) {
//获取当前商家列表
List orderItemList = cart.getOrderItemList();
//循环
for (TbOrderItem tbOrderItem : orderItemList) {
//返回合并后redis购物车集合
cartList1 = this.addGoodsToCartList(cartList1, tbOrderItem.getItemId(), tbOrderItem.getNum());
}
}
return cartList1;
}
控制层
修改 pinyougou-cart-web 工程 CartController 类的 findCartList 方法
/**
* 需求:查询购物车列表
*
* @return
*/
@RequestMapping("/findCartList")
public List findCartList(HttpServletRequest request) {
// 判断用户此时是否处于登录状态
// 获取用户名
String username = SecurityContextHolder.getContext()
.getAuthentication().getName();
//定义集合
List cartList = null;
// 查询cookie购物车数据
String cartListStr = CookieUtil.getCookieValue(request, "cartList", true);
// 登录
if (!username.equals("anonymousUser")) {
//判断cookie购物车不为空,合并
if(StringUtils.isNotBlank(cartListStr)){
//合并购物车
cartList = cartService.mergeCart(username,cartListStr);
}
//登录
cartList = cartService.findRedisCartList(username);
return cartList;
}
//未登录
// 判断集合是否存在值
if (StringUtils.isBlank(cartListStr)) {
cartListStr = "[]";
}
// 把购物车字符串转换成对象
cartList = JSON.parseArray(cartListStr, Cart.class);
return cartList;
}