Session中短信验证码设置有效时间

Session中短信验证码设置有效时间

package com.mozq.boot.kuayu01.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/*
 问题:短信验证码过期清除策略,因为使用任务调度,无法取消先前的任务,前一次验证码定时任务会清除后面生成验证码。
 方案:验证码加时间戳的方式,清除前先判断时间戳是不是与该任务相同,不想同则说明验证码已经重新生成,此定时任务不应清除这个验证码。
 */
@RestController
public class SmsController {
    //创建线程池对象
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);

    @RequestMapping("/sendSmsCheckCode")
    public String sendSmsCheckCode(HttpSession session){
        int code = (int) ((Math.random() + 1) * Math.pow(10, 5));
        String timeStamp = timeStamp();

        //添加时间戳
        Map<String, String> codeMap = new HashMap<>();
        codeMap.put("code", String.valueOf(code));
        codeMap.put("timestamp", timeStamp);

        session.setAttribute("code", codeMap);
        System.out.println(codeMap);

        //清除时根据时间戳判断是不是这个任务对应的验证码
        scheduledExecutorService.schedule(new Thread(()->{
            Map<String, String> codeMapS = (Map<String, String>) session.getAttribute("code");
            System.out.println(codeMapS);
            if(Objects.nonNull(codeMapS) && timeStamp.equals(codeMapS.get("timestamp"))){
                session.removeAttribute("code");
                System.out.println("清除session" + codeMapS);
            }
        }), 20, TimeUnit.SECONDS);
        return String.valueOf(code);
    }

    @RequestMapping("/check")
    public String check(HttpSession session){
        Integer code = (Integer) session.getAttribute("code");
        if(Objects.isNull(code)){
            System.out.println("验证码为空");
        }
        System.out.println(code);
        //使用一次之后,清除验证码
        session.removeAttribute("code");
        return String.valueOf(code);
    }

    public static String timeStamp(){
        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(new Date());
        return format;
    }
}

原文地址:https://www.cnblogs.com/mozq/p/12001442.html

时间: 2024-11-12 10:30:01

Session中短信验证码设置有效时间的相关文章

laravel中短信发送验证码的实现方法

https://mp.weixin.qq.com/s/4oy35LuaHZwkMNaQ69hTIg 在做用户注册和个人中心的安全管理时常常需要用到短信发送验证码,下面这篇文章主要给大家介绍了关于laravel中短信发送验证码的实现方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧.   前言 前段时间想实现一个短信验证码的功能,但是卡了很长时间. 首先我用的是阿里云的短信服务业务,其首次接入流程如下: 在阿里云上开通短信服务后需要做的: 1,申请签名 2,

Springboot使用session容器存取短信验证码

Springboot使用session容器存取短信验证码,(手抖挖了坑在@WebListener类声明时候加了个abstract导致springboot扫描不到这个监听器) 需求:为了给app做接口,在session中存取短信验证码,接口速速撸好swagger测试从session中拿短信验证码信息66的没问题(因为在浏览器范围访问,访问的时候请求头自动带着sessionid的所以没问题),当用postman测试拿到的session内容是null(原因是像手机app或者postman请求时候并没有

JAVA利用第三方平台发送短信验证码。

前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较. 为了防止有广告嫌疑

短信验证码实现

项目做了登录改密功能需要验证码的功能. 思路:页面点击获取验证码按钮,发送请求到后台,携带用户名作为参数.后台做一个servlet查询该用户的手机号.生成随机验证码.将验证码(+消息)+tel作为参数+其他接口参数拼成url调用第三方服务(云信). 实现: 1.页面js方法 function get_code_time(){ var uname = $("#uname").val(); if(!uname){ $("#users").html("请先输入您

正规短信验证码

1.松耦合可拓展短信验证码一般需要三张表,msg(短信记录表)msg_cfg(短信记录与模板关联表)msg_form(短信模板表) package com.qianmo.qmyj.bean.dto; /** * 短信验证码表 */ public class Msg { private String moblNo;//手机号 private String msgCodeType;//验证码类型 private String msgCode;//验证码 private String aplDateT

asp.net mvc 接入美圣短信 验证码发送

第1步:登录美圣短信控制台 http://www.rcscloud.cn/hy/HY_ZH/login 账号:******* 密码:******* http://www.rcscloud.cn/common/API 第2步:添加账号签名和短信模板 第3步:下载模板 第4步:在项目中新建项目GmkCollege.RCSCloud并将App_Code中的两个文件放到项目中,注意修改命名空间 第5步:前端 <tr class="margin-top"> <td class=

asp.net mvc 接入阿里大于 短信验证码发送

项目前端页面实例 第1步:登录阿里大于控制台 https://www.alidayu.com/center/user/account?spm=0.0.0.0.P1K1jG 第2步:创建应用 第3步:配置短信签名 第4步:配置短信模板 第5步:前端 <tr class="margin-top"> <td class="padding-top text-center">手机号</td> <td><input type

SSH2框架实现注冊发短信验证码实例

这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调用,可是前面前台的交互我差非常多,在这里总结一下,顺便跟大家看一下.怎么实现往手机上发送短信验证码的.. 大家先看看我的界面. 原图: 短信验证码错误的界面: 短信验证码正确的界面: 以下開始我的界面代码展示(JSP): <body > <h2 class="titlelog&qu

SSH2框架实现注册发短信验证码实例

这两天开始敲代码了,让用SSH2框架,以前没有接触过Java项目更没有接触过SSH2框架,所以用注册开始了我Java之旅.后来发现,后台代码挺容易理解的,跟.net的差不多,就是层与层之间的调用,但是前面前台的交互我差很多,在这里总结一下,顺便跟大家看一下,怎么实现往手机上发送短信验证码的.. 大家先看看我的界面. 原图: 短信验证码错误的界面: 短信验证码正确的界面: 下面开始我的界面代码展示(JSP): <body > <h2 class="titlelog"&g