來自:http://www.zhimengzhe.com/bianchengjiaocheng/Javabiancheng/200770.html
手機端發送短信驗證碼時,后台需要記錄生成的校驗碼checkCode,以便和用戶輸入的驗證碼進行匹配,
那么后台拿到的校驗碼存放在哪里好呢?
最開始想到的也是比較容易想到的方法是,在user表中創建新用戶,將驗證碼保存到數據庫,同時記錄下發送時間,
這樣在驗證時將用戶的驗證碼以及驗證的時間和數據庫中的值進行匹配就ok了。
但是,短信驗證碼的有效時間比較短,為記錄這個增加額外的字段總感覺有點浪費,於是我就想到,session不是有有效時間嗎,
能不能將checkCode放到session中,
然后利用session的有效時間來控制checkCode的有效時間呢?這樣做當然也能達到想要的效果,可是也帶來一個問題,
如果將session的有效時間設置成預想的短信驗證碼的有效時間,
那么每當客戶端空閑一小段時間之后就需要重新連接服務器,這對於用戶體驗來說顯然是不友好的。進一步想到,既然我已經將checkCode放到sesion中,
那么能否在指定的有效時間后將其從session中移除呢?這里自然就想到了用定時任務來實現。代碼片段如下:
@RequestMapping(value = "sendMessage",method = RequestMethod.GET) public Object sendMessage(final HttpServletRequest request){ String phone=request.getParameter("phone"); int times=userService.messageSendToday(phone); //二次驗證,單個手機號每日發送上限 if(times <= MAX_PER_DAY){ String checkCode=GenerateRandomCode.createRandomNumber(6); final HttpSession httpSession=request.getSession(); httpSession.setAttribute("checkCode",checkCode); CheckCodeMessage checkCodeMessage=new CheckCodeMessage(phone,checkCode); try { HttpSender.batchSend(checkCodeMessage); //TimerTask實現5分鍾后從session中刪除checkCode final Timer timer=new Timer(); timer.schedule(new TimerTask() { @Override public void run() { httpSession.removeAttribute("checkCode"); System.out.println("checkCode刪除成功"); timer.cancel(); } },5*60*1000); } catch (Exception e) { e.printStackTrace(); } return "redirect:/index.jsp"; } }