实现短信验证码有效时间

手机端发送短信验证码时,后台需要记录生成的校验码checkCode,以便和用户输入的验证码进行匹配,那么后台拿到的校验码存放在哪里好呢?

最开始想到的也是比较容易想到的方法是,在user表中创建新用户,将验证码保存到数据库,同时记录下发送时间,这样在验证时将用户的验证码以及验证的时间和数据库中的值进行匹配就ok了。

但是,短信验证码的有效时间比较短,为记录这个增加额外的字段总感觉有点浪费,于是我就想到,session不是有有效时间吗,能不能将checkCode放到session中,然后利用session的有效时间来控制checkCode的有效时间呢?这样做当然也能达到想要的效果,可是也带来一个问题,如果将session的有效时间设置成预想的短信验证码的有效时间,那么每当客户端空闲一小段时间之后就需要重新连接服务器,这对于用户体验来说显然是不友好的。

进一步想到,既然我已经将checkCode放到sesion中,那么能否在指定的有效时间后将其从session中移除呢?这里自然就想到了用定时任务来实现。代码片段如下:

<code class="hljs java has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@RequestMapping</span>(value = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"sendMessage"</span>,method = RequestMethod.GET)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Object <span class="hljs-title" style="box-sizing: border-box;">sendMessage</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> HttpServletRequest request){String phone=request.getParameter(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"phone"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> times=userService.messageSendToday(phone);    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//二次验证,单个手机号每日发送上限</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(times <= MAX_PER_DAY){String checkCode=GenerateRandomCode.createRandomNumber(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> HttpSession httpSession=request.getSession();httpSession.setAttribute(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"checkCode"</span>,checkCode);CheckCodeMessage checkCodeMessage=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CheckCodeMessage(phone,checkCode);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {HttpSender.batchSend(checkCodeMessage);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//TimerTask实现5分钟后从session中删除checkCode</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> Timer timer=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Timer();timer.schedule(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> TimerTask() {<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() {httpSession.removeAttribute(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"checkCode"</span>);System.out.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"checkCode删除成功"</span>);timer.cancel();}},<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">60</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (Exception e) {e.printStackTrace();}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"redirect:/index.jsp"</span>;}}</code>

实现短信验证码有效时间相关推荐

  1. java短信验证码失效时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...

    Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis) 这篇文章,实现了Java发送手机短信验证码发送的间隔时间,以及手机验证码的有效时间和手机验证码格式的合法性验证,可以防 ...

  2. Java设置短信间隔时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...

    标签:url   control   operation   短信验证码   reg   cep   ppi   任务   用户 Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+R ...

  3. java短信验证码失效时间_java实现短信验证码5分钟有效时间

    本文实例为大家分享了java实现短信验证码5分钟有效时间,供大家参考,具体内容如下 实现一个发送短信验证码的请求,要求5分钟之内重复请求,返回同一个验证码. 网上可找到几种方案: 如,存储数据库或缓存 ...

  4. 5.Spring Security 短信验证码登录

    Spring Security 短信验证码登录 在 Spring Security 添加图形验证码一节中,我们已经实现了基于 Spring Boot + Spring Security 的账号密码登录 ...

  5. Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用...

    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...

  6. Java调用WebService接口实现发送手机短信验证码功能

    为什么80%的码农都做不了架构师?>>>    一.样式示例: 二.前台的注册页面的代码:reg.jsp <%@ page language="java" ...

  7. 如何快速设计短信验证码

    ●●● 短信验证码浅析 什么地方会用到短信验证码 最常见的是各种产品的注册流程.短信验证码可降低非法注册.重复注册率,同时真实的手机号信息也利于产品运营.除注册外,登录,找回密码,开户,支付.更换设备 ...

  8. Vue_注册登录(短信验证码登录)

    一.前言 1.动态获取图片验证码 2.实现手机验证码登录(工具准备) 3.手机验证码登录(后台实现) 3.前台实现 二.主要内容 1.动态获取图片验证码 (1)请求的接口如下,返回的是一张svg的图片 ...

  9. java + maven 实现发送短信验证码功能

    如何使用java + maven的项目环境发送短信验证码,本文使用的是榛子云短信 的接口. 1. 安装sdk 下载地址: http://smsow.zhenzikj.com/doc/sdk.html ...

最新文章

  1. 所以,你自认为是一个合格的机器学习工程师?
  2. 微信、移动端css布局的那些坑
  3. Oracle查询优化-05元数据查询
  4. mysql 主从 问题_Mysql解决主从不同步问题
  5. python编写代码_用 Python 编写干净、可测试、高质量的代码
  6. C#曲线分析平台的制作(四,highcharts+ajax加载后台数据)
  7. python isinstance()
  8. wordpress for sae建站全过程
  9. feign消费时,如果传入参数过长,会导致feign.FeignException: status 400 reading错误
  10. LeetCode之Find Eventual Safe States(Kotlin)
  11. (转)关于最近疯狂流行的文件夹变成exe文件的病毒查杀办法
  12. VMware增强型键盘驱动程序
  13. 我对计算机基础的认识,我对计算机的认识
  14. 爬虫 第二讲 urllib模块和requests模块
  15. mx播放器有没有投屏功能_手机投屏到电视有5种方法,跟我这样操作,仅需2步就搞定...
  16. 6360. 【NOIP2019模拟2019.9.18】最大菱形和(rhombus)
  17. 数据结构队列之企业级应用--优先队列
  18. Matplotlib和Seaborn(离散数据的图表选择与一些使用技巧)
  19. halconc#软件收费吗_没事别想不开做Halcon机器视觉工程师
  20. PyTorch中nn.ReLU(inplace=True)中inplace=True有什么用

热门文章

  1. Linux从入门到放弃 k8s 安装部署
  2. MFC禁用编辑框输入法
  3. centos 日志审计_生产环境日志审计
  4. SAAS之Multi-Tenancy解析
  5. 02-SQL语句给表起别名SQL中的表连接
  6. 如果不开心,请看一下
  7. 搜狗输入法无法输出中文
  8. 那些在做固态盘SSD的其实在研究这仨东西
  9. java查询图片前台展示_Java +spring MVC 后台图片流在前台页面显示
  10. python中utf-8编码_Python 使用 UTF-8 编码(转)