JAVA短信验证码 工具类

Wesley13
• 阅读 385

MsgCodeUtil.java

package com.hg.util;

import com.soyea.enums.ResultEnum;
import com.soyea.exception.BizException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Encoder;

import javax.servlet.http.HttpSession;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 短信验证码工具
 */
public class MsgCodeUtil {

    /*
    resultEnum中的参数
    ERROR_MOBILE(1001002,"请填写正确的手机号码"),
    MESSAGE_TIME_ERROR(1001003,"60秒内只能发送一次短信,请稍后再试"),
    MESSAGE_SEND_ERROR(1001004,"发送短信出错,请稍后再试"),
    MOBILE_NOT_SEND_CODE(1001005,"该手机号未获取验证码,请先获取验证码"),
    MOBILE_CAN_NOT_CHANGE(1001006,"此手机号与获取验证码的手机号不一致"),
    MESSAGE_CODE_INVALID(1001007,"此验证码失效,请重新获取验证码"),
    MESSAGE_CODE_ERROR(1001008,"验证码错误"),

     */

    private static Logger log = LoggerFactory.getLogger(MsgCodeUtil.class);

    private static final String MSG_START_TIME = "msg_start_time"; //短信发送时间
    private static final String MOBILE_MSG_MOBILE = "mobile_msg_mobile"; //手机号
    private static final String MOBILE_MSG_CODE = "mobile_msg_code"; //验证码
    private static final Integer CODE_VALID_TIME = 5; //验证码有效时间,单位:分钟    /**
     * 发送验证码
     * @param msgCode 验证码
     * @param phone 电话号码
     * @param session
     */
    public static void sendCode(String msgCode, String phone, HttpSession session)  {
        //获取当前时间
        long startTime = System.currentTimeMillis();
        long startTimefromSessioin = (long) (httpSession.getAttribute(MSG_START_TIME) == null ? 0L : httpSession.getAttribute(MSG_START_TIME));
        //验证码获取一次最少60秒 为了防止网络延迟 设置成55
        if (((startTime - startTimefromSessioin) / 1000) <= (long) 55) {
            //发送验证码太频繁
            throw new BizException(ResultEnum.MESSAGE_TIME_ERROR.getMsg());
        }
        //发送短信
        //todo 封装短信内容
        String message = "验证码:" + msgCode + ","+CODE_VALID_TIME+"分钟内有效";
        //todo 调用第三方接口发送短信
//        Boolean sendSuccess = axisSendMsg(message, phone);
        Boolean sendSuccess = true;
        if (sendSuccess) {
            //短信发送成功,设置属性到session
            saveCode(session,phone,msgCode);
        } else {
            //短信发送失败,请稍后再试
            throw new BizException(ResultEnum.MESSAGE_SEND_ERROR.getMsg());
        }

    }    //校验验证码
    public static boolean validateCode(String mobile, String code, HttpSession session) {
        //判断该手机号是否发送过验证码
        String mobileFromSession = (String) session.getAttribute(MOBILE_MSG_MOBILE);
        if (StringUtils.isBlank(mobileFromSession)) {
            //未发送过验证码
            throw new BizException(ResultEnum.MESSAGE_CODE_NO_SEND.getMsg());
        }

        //判断手机号是否是发送验证码的手机号
        if (!mobile.equals(mobileFromSession))
            throw new BizException(ResultEnum.MOBILE_CAN_NOT_CHANGE.getMsg());

        //获取短信发送时间
        long startTimeFromSession = (long) session.getAttribute(MSG_START_TIME);
        //判断当前验证码是否失效
        if (((System.currentTimeMillis() - startTimeFromSession) / 1000) > ((long) CODE_VALID_TIME * 60)) {
            throw new BizException(ResultEnum.MESSAGE_CODE_ERROR.getMsg());
        }

        //判断验证码是否输入正确
        if (!code.equals((String) session.getAttribute(MOBILE_MSG_CODE))) {
            throw new BizException(ResultEnum.MESSAGE_CODE_IS_ERROR.getMsg());
        }

        //校验通过
        return true;
    }    /**
     * 短信发送成功后,保存验证码
     */
    public static void saveCode(HttpSession session,String phone,String msgCode) {
        session.setAttribute(MSG_START_TIME, System.currentTimeMillis());
        session.setAttribute(MOBILE_MSG_MOBILE, phone);
        session.setAttribute(MOBILE_MSG_CODE, msgCode);
    }

    /**
     * 使用验证码后,销毁验证码
     */
    public static void consumeCode(HttpSession session) {
        session.removeAttribute(MOBILE_MSG_MOBILE);
        session.removeAttribute(MSG_START_TIME);
        session.removeAttribute(MOBILE_MSG_CODE);
    }

    /**
     * 生成4位数字验证码
     */
    public static String createRandomVcode() {
        String vcode = "";
        for (int i = 0; i < 4; i++) {
            vcode = vcode + (int) (Math.random() * 9);
        }
        return vcode;
    }    /**
     * 校验手机号是否合法
     */
    public static Boolean isMobile(String number) {
        boolean flag = false;
        try {
            Pattern p = Pattern.compile("^(13[0-9]|15[012356789]|17[0-9]|18[0-9]|14[57])[0-9]{8}$");
            Matcher m = p.matcher(number);
            flag = m.matches();
        } catch (Exception e) {
            flag = false;
        }
        return flag;
    }

}
点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
5个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
5个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
5个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
5个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
密钥管理系统-为你的天翼云资产上把“锁
本文关键词:数据安全,密码机,密钥管理一、你的云上资产真的安全么?1.2021年1月,巴西的一个数据库30TB数据被破坏,泄露的数据包含有1.04亿辆汽车和约4000万家公司的详细信息,受影响的人员数量可能有2.2亿;2.2021年2月,广受欢迎的音频聊天室应用Clubhouse的用户数据被恶意黑客或间谍窃取。据悉,一位身份不明的用户能够将Clubho
NVIDIA安培架构下MIG技术分析
关键词:NVIDIA、MIG、安培一什么是MIG2020年5月,NVIDIA发布了最新的GPU架构:安培,以及基于安培架构的最新的GPU:A100。安培提供了许多新的特性,MIG是其中一项非常重要的新特性。MIG的全名是MultiInstanceGPU。NVIDIA安培架构中的MIG模式可以在A100GPU上并行运行七个作业。多实
helloworld_28799839 helloworld_28799839
5个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue