本帖最后由 谷粒姐姐 于 2018-10-25 11:49 编辑
4. Redis存储购物车 4.1 需求分析判断当前用户是否登陆,如果未登录采用 Cookie 存储,如果登录则采用 Redis 存储。登录后要进行 Cookie 购物车与 Redis 购物车的合并操作,并清除 Cookie 购物车。 4.2 获取当前登录人账号 4.2.1 配置文件 spring-security.xml 更改配置: 去掉 [AppleScript] 纯文本查看 复制代码 <http pattern="/cart/*.do" security="none"></http> 添加 [AppleScript] 纯文本查看 复制代码 <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"的话,无论是否登陆都不能获取登录人账号的值。 4.1.1 代码实现 在 pinyougou-cart-web 的 findCartList 和 addGoodsToCartList 方法中,获取用户名 [AppleScript] 纯文本查看 复制代码 //得到登陆人账号,判断当前是否有人登陆
String username = SecurityContextHolder.getContext().getAuthentication().getName(); 测试:当用户未登陆时,username 的值为 anonymousUser 4.1 远程购物车存取 4.1.1 服务接口层 pinyougou-cart-interface 中 CartService.java 定义方法 [AppleScript] 纯文本查看 复制代码 /**
*从 redis 中查询购物车
*@param username
*@return
*/
public List<Cart> findCartListFromRedis(String username);
/**
*将购物车保存到 redis
*@param username
*@param cartList
*/
public void saveCartListToRedis(String username,List<Cart> cartList); 4.1.1 服务实现层 pinyougou-cart-service 中 CartServiceImpl.java 实现方法 [AppleScript] 纯文本查看 复制代码 @Autowired
private RedisTemplate redisTemplate; @Override
public List<Cart> findCartListFromRedis(String username) {
System.out.println("从 redis 中提取购物车数据....."+username); List<Cart> cartList = (List<Cart>)
redisTemplate.boundHashOps("cartList").get(username);
if(cartList==null){ cartList=new ArrayList();
}
return cartList;
}
@Override
public void saveCartListToRedis(String username, List<Cart> cartList) {
System.out.println("向 redis 存入购物车数据....."+username); redisTemplate.boundHashOps("cartList").put(username, cartList);
} 4.1.1 控制层 修改 CartController.java 的 findCartList 方法 [AppleScript] 纯文本查看 复制代码 /**
*购物车列表
*@param request
*@return
*/
@RequestMapping("/findCartList")
public List<Cart> findCartList(){ String username =
SecurityContextHolder.getContext().getAuthentication().getName();
if(username.equals("anonymousUser")){//如果未登录
//读取本地购物车//
..........
return cartList_cookie;
}else{//如果已登录
List<Cart> cartList_redis =cartService.findCartListFromRedis(username);//从
redis 中提取
return cartList_redis;
}
} 修改 addGoodsToCartList 方法 [AppleScript] 纯文本查看 复制代码 /**
*添加商品到购物车
*@param request
*@param response
*@param itemId
*@param num
*@return
*/ @RequestMapping("/addGoodsToCartList")
public Result addGoodsToCartList(Long itemId,Integer num){
String username = SecurityContextHolder.getContext().getAuthentication().getName();
System.out.println("当前登录用户:"+username);
try {
List<Cart> cartList =findCartList();//获取购物车列表
cartList = cartService.addGoodsToCartList(cartList, itemId, num);
if(username.equals("anonymousUser")){ //如果是未登录,保存到 cookie util.CookieUtil.setCookie(request, response, "cartList",
JSON.toJSONString(cartList),3600*24 ,"UTF-8");
System.out.println("向 cookie 存入数据");
}else{//如果是已登录,保存到 redis
cartService.saveCartListToRedis(username, cartList);
}
return new Result(true, "添加成功");
} catch (RuntimeException e) { e.printStackTrace();
return new Result(false, e.getMessage());
}catch (Exception e) { e.printStackTrace();
return new Result(false, "添加失败");
}
}
为避免调用远程服务超时,我们可以将过期时间改为 6 秒(默认为 1 秒)
@Reference(timeout=6000)
private CartService cartService;
|