1.1 需求分析
- 使用Cookie存储购物车数据,服务层负责业务逻辑,控制器层负责读写cookie。
- 说明:Cookie的value存储List<Cart> 的json格式字符串数据(中文需要Unicode编码,因为cookie的值不能存在中文字符)
- 总结:
实现cookie存储购物车控制器层代码:
cookieName: pinyougou_cart
cookieValue: List<Cart>集合转化成json格式的字符串,有中文需要转码。- 实现步骤:
- 定义CartController.java控制器,读写购物车。
把商品添加到购物车,再把购物车存储Cookie
先从浏览器中获取Cookie,从Cookie中获取原来的购物车
- 详细步骤:(未登录的用户,购物车存储到Cookie)
- 获取购物车
- 把商品添加到购物车
- 把添加后的购物车存储到Cookie
- Cookie工具类(放在common工程中)
public final class CookieUtils { /** 定义Cookie名称的静态内部类 */ public static class CookieName{ /** 定义存放在Cookie中购物车的名称 */ public static final String PINYOUGOU_CART = "pinyougou_cart"; } /** * 根据Cookie的名称获取指定的Cookie * @param request 请求对象 * @param cookieName cookie的名称 * @return Cookie */ public static Cookie getCookie(HttpServletRequest request, String cookieName){ /** 获取所有的Cookie */ Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0){ for (Cookie cookie : cookies){ if (cookie.getName().equals(cookieName)){ return cookie; } } } return null; } /** * 根据CookieName获取指定的Cookie值 * @param request 请求对象 * @param cookieName cookie的名称 * @param encoded 是否编码 * @return Cookie的值 */ public static String getCookieValue(HttpServletRequest request, String cookieName, boolean encoded) { /** 获取指定的Cookie */ Cookie cookie = getCookie(request, cookieName); String cookieValue = null; try { if (cookie != null) { if (encoded){ cookieValue = URLDecoder.decode(cookie.getValue(), "UTF-8"); }else{ cookieValue = cookie.getValue(); } } } catch (Exception e) { e.printStackTrace(); } return cookieValue; } /** * 根据Cookie的名称删除指定的Cookie * @param request 请求对象 * @param response 响应对象 * @param cookieName cookie名称 */ public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) { setCookie(request, response, cookieName, null, 0, false); } /** * 设置Cookie * @param request 请求对象 * @param response 响应对象 * @param cookieName cookie的名称 * @param cookieValue cookie的值 * @param maxAge 存放Cookie的最大存放时间(按秒计算) * @param encoded 是否编码 */ public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int maxAge, boolean encoded) { try { /** 对Cookie的值进行判断 */ if (cookieValue == null) { cookieValue = ""; } if (encoded) { cookieValue = URLEncoder.encode(cookieValue, "UTF-8"); } Cookie cookie = getCookie(request, cookieName); if (cookie == null){ cookie = new Cookie(cookieName, cookieValue); } /** 设置Cookie的值 */ cookie.setValue(cookieValue); /** 设置最大存活时间 */ cookie.setMaxAge(maxAge); /** 设置访问路径 */ cookie.setPath("/"); /** 添加到用户浏览器 */ response.addCookie(cookie); } catch (Exception e) { e.printStackTrace(); } } }
CartController.java控制器:
/** 购物车控制器 */ @RestController @RequestMapping("/cart") public class CartController { @Reference(timeout = 30000) private CartService cartService; @Autowired private HttpServletRequest request; @Autowired private HttpServletResponse response;
/** 添加SKU商品到购物车 */ @GetMapping("