判断当前用户是否登陆,如果未登录采用 Cookie 存储,如果登录则采用 Redis 存储。登录后要进行 Cookie 购物车与 Redis 购物车的合并操作,并清除 Cookie 购物车。
获取当前登录人账号
spring-security.xml 更改配置:
去掉<http pattern="/cart/*.do" security="none"></http> 添加<http use-expressions="false" entry-point-ref="casProcessingFilterEntryPoint">
<intercept-url pattern="/cart/*.do" access="IS_AUTHENTICATED_ANONYMOUSLY"/><intercept-url pattern="/**" access="ROLE_USER"/>
<custom-filter position="CAS_FILTER" ref="casAuthenticationFilter" />
<custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>
<custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>
</http> 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<Cart> findRedisCartList(String username);
/**
* 把购物车列表保存到redis购物车
* @param cartList
* @param username
*/
void saveCartListToRedisCart(List<Cart> cartList, String username); 服务层实现
pinyougou-cart-service 中 CartServiceImpl.java 实现方法/**
* 需求:查询redis购物车数据
*
* @return
*/
public List<Cart> findRedisCartList(String username) {
// 查询redis服务购物车列表
List<Cart> cartList = (List<Cart>) redisTemplate.boundHashOps(
"cartList").get(username);
// 判断查询购物车数据是否有值
if (cartList == null) {
return new ArrayList<Cart>();
}
return cartList;
}
/**
* 把购物车列表保存到redis购物车
*
* @param cartList
* @param username
*/
public void saveCartListToRedisCart(List<Cart> cartList, String username) {
// TODO Auto-generated method stub
redisTemplate.boundHashOps("cartList").put(username, cartList);
} 控制层
修改 CartController.java 的 findCartList 方法/**
* 需求:查询购物车列表
*
* @return
*/
@RequestMapping("/findCartList")
public List<Cart> findCartList(HttpServletRequest request) {
// 判断用户此时是否处于登录状态
// 获取用户名
String username = SecurityContextHolder.getContext()
.getAuthentication().getName();
//定义集合
List<Cart> 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<Cart> 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 ,页面添加脚本<script type="text/javascript">
location.href="cart.html";
</script> (2)购物车页面链接到跳板页请<a href="login.html">登录</a>
购物车合并
服务接口层
pinyougou-cart-interface 工程的 CartService.java 定义方法/**
* 需求:合并购物车数据
* @param username
* @param cartListStr
*/
List<Cart> mergeCart(String username, String cartListStr); 服务实现层
pinyougou-cart-service 工程 CartServiceImpl.java 实现方法/**
* 需求:合并购物车数据
*
* @param username
* @param cartListStr
*/
public List<Cart> mergeCart(String username, String cartListStr) {
// 根据用户名查询所有购物车数据
List<Cart> cartList1 = (List<Cart>) redisTemplate.boundHashOps("cartList").get(username);
// 把cookie购物车数据转换集合
List<Cart> cartList2 = JSON.parseArray(cartListStr, Cart.class);
//循环redis购物车
for (Cart cart : cartList2) {
//获取当前商家列表
List<TbOrderItem> 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<Cart> findCartList(HttpServletRequest request) {
// 判断用户此时是否处于登录状态
// 获取用户名
String username = SecurityContextHolder.getContext()
.getAuthentication().getName();
//定义集合
List<Cart> 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;
}
|