黑马程序员技术交流社区
标题: 【郑州校区】Java之品优购课程讲义_day16(5) [打印本页]
作者: 谷粒姐姐 时间: 2018-10-24 11:29
标题: 【郑州校区】Java之品优购课程讲义_day16(5)
本帖最后由 谷粒姐姐 于 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;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |