问题描述

场景:手机验证码登录
要求:1. 验证码5分钟失效 2. 登录后验证码失效 3. 验证码重发

自己的方案

  1. 因为是Servlet开发,所以每个Servlet(默认)在接口被访问时实例化,且是单实例的情况。所以我选择使用两个静态变量(HashMap)来存储手机-验证码和手机-定时器(实例变量也可以,不关键)
  2. 每个验证码请求发过来,首先生成验证码
  3. 如果验证码生成成功(短信服务商的响应成功),那么将验证码和手机号存入map,且存一个定时器
  4. 登录请求中判断手机号和验证码是否和系统中匹配,如果不匹配登录失败,匹配的话登录成功且清除其对应的验证码和定时器
  5. 如果验证码失效(定时器任务执行),那么登录也失败
  6. 如果验证码存在且又有验证码请求,则重新生成验证码并且更新定时器和验证码

老师的讲解

上述方案的缺点:数据存储在内存,一旦出现流量高峰可能会内存溢出(可以对map本身做限制,但是可能会影响用户体验)。且如果出现灾难事件,那么所有数据失效(毕竟短信也要钱),因为这些数据没有备份,所以是后果不可挽回(可能大部分用户都需要重新发送验证码)
更好的方案:使用缓存数据库(redis),且不需要手动删除(手机号作为key,登录删除或过期删除),且其有备份策略(恢复机制)

联想:所有(可能)有存储需求的数据都不在内存中放,即Web应用仅关注逻辑计算而不负责任何的存储责任

posted on 2020-12-23 10:22  老鼠不上树  阅读(916)  评论(0)    收藏  举报