A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谷粒姐姐 于 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;


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马