集群或分布式系统会话
本质都是多个系统,假设这个里有两个服务器节点,分别是AB系统,他们可以是集群,也可以是分布式系统,一开始用户和A系统交互,那么这个时候的用户状态,我们可以保存到redis中, 作为A系统的会话信息,随后用户的请求
进入到了B系统,那么B系统中的会话我也同样和redis关联,如此AB系统的session就统一 了。 当然cookie是会随着用户的访问携带过来的。那么这个其实就是分布式会话,通过redis来保存用户的状态。
注册登录时代码
@PostMapping("/login") @ApiOperation(value = "用户登录",notes = "用户登录") public ResponseResult login(@RequestBody UserBO userBO, HttpServletRequest request, HttpServletResponse response){ String username = userBO.getUsername(); String password = userBO.getPassword(); // 1.校验 if(StringUtils.isBlank(username) || StringUtils.isBlank(password)){ return ResponseResult.errorMsg("用户名或密码不能为空"); } // 2.登录 Users user = userService.queryUserForLogin(username,password); if(user == null){ return ResponseResult.errorMsg("用户名或密码错误"); } // 首先清空用户敏感信息 user = setUserNull(user); // 创建Token,使用UUID String userToken = UUID.randomUUID().toString().trim(); redisOperator.set("redis_user_token:" + user.getId(),userToken); UsersVO usersVO = new UsersVO(); BeanUtils.copyProperties(user,usersVO); usersVO.setUserUniqueToken(userToken); // 4.设置cookie CookieUtils.setCookie(request,response,"user", JsonUtils.objectToJson(usersVO),true); // 同步购物车数据 SyncShopcart(user.getId(),request,response); return ResponseResult.ok(user); }
退出登录的代码
@PostMapping("/logout") @ApiOperation(value = "用户退出登录",notes = "用户退出登录") public ResponseResult logout(@RequestParam String userId, HttpServletRequest request, HttpServletResponse response){ // 1.清除cookie CookieUtils.deleteCookie(request,response,"user"); // 清除分布式会话 redisOperator.del(CommonConstant.REDIS_USER_TOKEN + userId); // 清除cookie购物车 CookieUtils.deleteCookie(request,response,""); return ResponseResult.ok(); }