JAVA短信验证码 工具类

Wesley13
• 阅读 511

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;
    }

}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
宙哈哈 宙哈哈
1年前
【总结】Java实现短信验证码
Java是一种流行的编程语言,验证码是一种常用的网络安全技术。Java发展至今,网上也出现了各种各样的验证码,本人初学Java,下面是我用Java实现短信验证码的总结。
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
Excel导出工具类.
 Excel导出工具类.POIimport java.io.OutputStream;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.uti
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
Java日期时间API系列35
  通过Java日期时间API系列1Jdk7及以前的日期时间类(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12032719.html)中得知,Java8以前除了java.sql.Timestamp扩充
贾迎春 贾迎春
11个月前
Java行为验证码
Java是一种流行的编程语言,验证码是一种常用的网络安全技术。Java发展至今,网上也出现了各种各样的验证码,本人初学Java,下面是我用Java实现短信验证码的总结。
京东云开发者 京东云开发者
5个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了