简历_使用 Redis 解决集群模式下的 Session 共享问题,使用拦截器实现用户的登录,校验和权限刷新以及对单位时间内请求频繁的用户IP地址进行限流。

系列博客目录



1.使用 Redis 解决集群模式下的 Session 共享问题

集群的session共享问题

session共享问题:多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。

session的替代方案应该满足:

  • 数据共享
  • 内存存储
  • key、value结构

在这里插入图片描述
如下图所示,以前是保存到session现在是Redis。
在这里插入图片描述
如下图所示,之前是请求并携带cookie,从session中获取用户。
在这里插入图片描述
在这里插入图片描述

@PostMapping("code")
public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
   
    // 发送短信验证码并保存验证码
    return userService.sendCode(phone,session);

}

@PostMapping("/login")
public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
   
    // 实现登录功能
    return userService.login(loginForm, session);
}
@Override
public Result sendCode(String phone, HttpSession session) {
   
    // 1.校验手机号
    if (!RegexUtils.isCodeInvalid(phone)) {
   
        // 2.如果不符合,返回错误信息。
        return Result.fail("手机号格式错误");
    }
    // 3.符合,生成验证码
    String code = RandomUtil.randomNumbers(6);
    // 4.保存验证码到redis

    stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone,code,LOGIN_CODE_TTL, TimeUnit.MINUTES);
    // session.setAttribute("code", code);
    // 5.发送验证码,这里不调用第三方了,不是讲解的重点    
    log.debug("发送短信验证码成功,验证码{}", code);
    // 6.返回ok
    return Result.ok();
}

@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {
   
    // 1.校验手机号
    String phone = loginForm.getPhone();
    if(RegexUtils.isPhoneInvalid(phone)){
   
        // 2.如果不符合,返回错误信息
        return Result.fail("手机号格式错误");
    }
    // 3.从redis获取验证码并校验
    String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
    // Object cacheCode = session.getAttribute("code");
    String code = loginForm.getCode();
    if(cacheCode == null || !cacheCode.equals(code)){
   
        // 3.不一致
        return Result.fail("验证码错误");
    }
    // 4.一致
    User user = query().eq("phone",phone).one();
    // 5.判断用户是否存在
    if(user == null){
   
        // 6.不存在,创建新用户并保存
        user = createUserWithPhone(phone);
    }
    // 7.保存用户信息到redis中
    // 7.1.随机生成Token
    String token = UUID.randomUUID().toString(true);

    // 7.2.将User对象转为HashMap存储
    UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
    Map<String, Object
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值