为了账号安全,请及时绑定邮箱和手机立即绑定

短信验证清理验证码

短信验证清理验证码

墨色风雨 2019-03-13 14:15:05
java后台关于短信验证码的问题本想把验证码放到session中,一提出就被否决了。说不好管理。因为时效只有两分钟。现在方案是这样的 两个map 以输入文本框的手机号码为key 值。 分别放入 截至时间 和 验证码。然后通过第三短信平台发送的验证码和现在对比做逻辑。 问题是。假日2分钟后没人输入验证码。重新发送的验证码要失效才行。我本想写个定时器的 但是2分钟内它一直开着。如果同一时间。其他人就没法操作了 。希望给位指导下 别说redis。不会它。或者大家给个解决方案吧 什么时候清除合适
查看完整描述

4 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

  1. 设置一个有效期长量,如 120 秒

  2. 用户申请短信验证码

  3. 服务端根据用户的手机号创建记录:创建时间、手机号、验证码、激活状态(默认为否)

  4. 提交第 3 方短信平台(如果有必要等结果再对条目的状态做标记,那就另说)

  5. 用户提交验证,服务端读取『手机号+验证码』及创建时间倒序的第 1 条,,

    1. 过期,直接驳回

    2. 没过期,继续下面的业务,将数据库里条目状态标记为已激活

    1. 如不存在,直接驳回(可能被删了,也可能是手机号码、验证码之一不正确)

    2. 如已存在,检查过期时间(用户提交时间-条目创建时间是否小于等于 120 秒)

与此同时,跑一个定时脚本,每隔 10 分钟啊 20 分钟去删数据:

  1. 已验证的。

  2. 距离脚本操作时间大于 120 秒或更长时间的;

希望有用。


查看完整回答
反对 回复 2019-04-24
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

Redis清除过期缓存就两种办法:

  1. 根据key获取value时判断是否过期

  2. 通过一个过期队列(根据过期时间排序)来清除过期数据

所以对于验证码这种也可以考虑这么做:
方案一: 在输入验证码之后,判断验证码是否正确的时候,如果验证码正确,判断一下验证码是否过期。
方案二: 将手机号码,验证码存储到一个Map中,同时将手机号码,过期时间存储到DelayQueue中。另起一个线程,不断地从DelayQueue中获取元素,将获取到的元素从Map删除。

这两个方案可以同时都用,或者只用其一。

DelayQueue: 延时队列,Blocking队列,内部实现是用一个Priority队列,以延迟时间作为比较的依据。只有达到延迟时间之后元素才可以被获得,可用于清除空闲连接,过期缓存,超时任务等(例如缓存,将缓存对象放到DelayQueue中,delay时间等于缓存过期时间,运行一个deamon线程从DelayQueue中获取元素,然后将其清除)。


查看完整回答
反对 回复 2019-04-24
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

你直接试试SUBMAIL短信平台吧。在线发送就可以,他们这个平台本身就能设置定时。


查看完整回答
反对 回复 2019-04-24
  • 4 回答
  • 0 关注
  • 392 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信