【Redis系列】利用redis设计高效的短信登录功能,解决session共享问题

一、 基于Session实现登录流程分析

0. Tomcat运行原理:

在这里插入图片描述
  当用户发起请求时,会访问我们向tomcat注册的端口,任何程序想要运行,都需要有一个线程对当前端口号进行监听,tomcat也不例外,当监听线程知道用户想要和tomcat连接时,那会由监听线程创建socket连接,socket都是成对出现的,用户通过sockettomcat相互相传递数据,当tomcat端的socket接收到数据后,此时监听线程会从tomcat线程池中取出一个线程执行用户请求,在我们的服务部署到tomcat后,线程会找到用户想要访问的工程,然后用这个线程转发到工程中的controllerservicedao中,并且访问对应的DB,在用户执行完请求后,再统一返回,再找到tomcat端的socket,再将数据写回到用户端的socket,完成请求和响应。

关于ThreadLocal: 在ThreadLocal中,无论是其put方法或get方法, 都是先从获得当前用户的线程,然后从线程中取出线程的成员变量map,只要线程不一样,map就不一样,所以可以通过这种方式来做到线程隔离。

1. 发送验证码:

  用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号。如果手机号合法,后台此时生成对应的验证码,同时将验证码保存到session中,然后再通过短信的方式将验证码发送给用户。

@Override
public Result sendCode(String phone, HttpSession session) {
   
   
    // 1.校验手机号
    if (RegexUtils.isPhoneInvalid(phone)) {
   
   
        // 2.如果不符合,返回错误信息
        return Result.fail("手机号格式错误!");
    }
    // 3.符合,生成验证码
    String code = RandomUtil.randomNumbers(6);
    // 4.保存验证码到 session
    session.setAttribute("user", BeanUtils.copyProperties(user,UserDTO.class));
    // 5.发送验证码
    log.debug("发送短信验证码成功,验证码:{}", code);
    // 返回ok
    return Result.ok();
}
2. 短信验证码登录、注册:

  用户将验证码和手机号进行输入,后台从session中拿到当前验证码,然后与用户输入的验证码进行校验,如果不一致,则无法通过校验,如果一致,则后台根据手机号到MySQL中查询用户,如果用户不存在,则为用户创建账号信息,保存到数据库,无论是否存在,都会将用户信息保存到session中,方便后续获得当前登录信息。

@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {
   
   
    // 1.校验手机号
    String phone = loginForm.getPhone();
    if (
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值