【项目学习】谷粒商城学习记录8 - 购物车
本节起将不对一些重复细节进行详细说明
一、环境搭建 & 准备工作
1.1. 创建新模块
- 注意java版本信息后面在pom.xml文件里修改
- 导入公共模块依赖
- 写配置信息
- 启动类加上注册发现和Feign功能
- 修改网关
- id: gulimall_cart_route uri: lb://gulimall-cart predicates: - Host=cart.gulimall.cn
1.2. 静态页面搭建
- 设置域名
- 将注册页面和登录页面放在服务资源目录下
- 登录、注册页面动静分离,将静态资源移到nginx下
- 修改页面内的路径
- 测试:
1.3. 数据存储结构:
1.4. 完善页面细节,实现页面跳转
二、ThreadLocal 用户身份鉴别
-
创建service.CartService和impl.CartServiceImpl
-
创建拦截器interceptor.CartInterceptor
-
实现拦截器在业务执行前的功能:
public class CartInterceptor implements HandlerInterceptor { public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>(); /** * 目标方法执行之前 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { UserInfoTo userInfoTo = new UserInfoTo(); HttpSession session = request.getSession(); MemberRespVo member = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGIN_USER); if(member != null) { //用户登录了 userInfoTo.setUserId(member.getId()); } Cookie[] cookies = request.getCookies(); if(cookies != null && cookies.length > 0) { for (Cookie cookie : cookies) { //user-key String name = cookie.getName(); if(name.equals(CartConstant.TEMP_USER_COOKIE_NAME)) { userInfoTo.setUserKey(cookie.getValue()); userInfoTo.setTempUser(true); } } } //如果没有临时用户一定分配一个临时用户 if(StringUtils.isEmpty(userInfoTo.getUserKey())) { String uuid = UUID.randomUUID().toString(); userInfoTo.setUserKey(uuid); } //目标方法执行之前 threadLocal.set(userInfoTo); return true; } }
-
ThreadLocal能够在整个线程内共享数据
-
测试:
-
实现拦截器在业务处理后的功能
/** * 业务执行之后,分配临时用户,让浏览器保存 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { UserInfoTo userInfoTo = threadLocal.get(); if(!userInfoTo.isTempUser()) { Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, userInfoTo.getUserKey()); cookie.setDomain("gulimall.com"); cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIMEOUT); response.addCookie(cookie); } }
-
测试: