验证码

包括过期时间和redis缓存以及校验

1.设置过期时间

private Date getNextDayZeroTime() {Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DAY_OF_MONTH, 1);calendar.set(Calendar.HOUR_OF_DAY, 2);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);return calendar.getTime();
}

2.随机生成验证码和验证码令牌

public String generateSmsCode() {Random random = new Random();String ch = "0123456789qwertyuiopasdfghjklzxcvbnm";int length = ch.length();String str = "";for (int i = 0; i < 6; i++) {int index = random.nextInt(length);str += ch.substring(index, index + 1);}return str;
}
public String verifyCode() {Random random = new Random();String ch = "0123456789";int length = ch.length();String str = "";for (int i = 0; i < 4; i++) {int index = random.nextInt(length);str += ch.substring(index, index + 1);}return str;
}

3.把验证码写入redis

public Tuple getCode(UserVo userVo) {CodeVo codeVo = new CodeVo();String validateNumber = "sms";RedisLock redisLock = new RedisLock(redisTemplate, validateNumber, 60000, 60000);String codeLimitKey = "key:phone:count:" + userVo.getTelPhone();String codeLimitValue = redisLock.get(codeLimitKey);Integer codeLimit = StringUtils.isBlank(codeLimitValue) ? 0 : Integer.parseInt(codeLimitValue);if (codeLimit.intValue() > 5) {return Tuple.createTuple(1, "验证码次数已达上限");}redisLock.set(codeLimitKey, codeLimit + 1 + "");//redisLock.setNX(codeLimitKey, codeLimit + 1 + "");redisLock.expireAt(codeLimitKey, this.getNextDayZeroTime());String verifyCode = this.verifyCode();String msgCode = this.generateSmsCode();codeVo.setSmsCode(msgCode);codeVo.setVerifyCode(verifyCode);codeVo.setTelPhone(userVo.getTelPhone());codeVo.setCodeNum(codeLimitValue);String codeVoStr = FastJsonUtil.beanToJson(codeVo);redisLock.setNX("key:phone:code:" + verifyCode, codeVoStr, 5 * 60);return Tuple.createTuple(0, codeVo);
}

4.实体类

public class CodeVo {private String verifyCode;//验证码令牌private String codeNum;//验证码次数private String smsCode;//短信验证码private String telPhone;//手机号码

5.redis方法

从redis取出来

public String get(final String key) {Object obj = null;try {obj = redisTemplate.execute(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {RedisSerializer<String> serializer = redisTemplate.getStringSerializer();byte[] data = connection.get(serializer.serialize(key));// connection.close();if (data == null) {return null;}return serializer.deserialize(data);}});} catch (Exception e) {logger.error("get redis error, key : {}", key);logger.error("error in RedisLock get :" + e.getMessage());}return obj != null ? obj.toString() : null;
}

存入redis

public void set(final String key, final String value) {redisTemplate.execute(new RedisCallback<Serializable>() {@Overridepublic Serializable doInRedis(RedisConnection connection) throws DataAccessException {connection.set(redisTemplate.getStringSerializer().serialize(key), redisTemplate.getStringSerializer().serialize(value));return true;}});
}

设置过期时间

public Boolean expireAt(String key, Date date) {return redisTemplate.expireAt(key, date);
}

6.申请短信验证码账号

@Value("${message.url}")private String url;@Value("${message.appKey}")private String appKey;@Value("${message.appSecret}")private String appSecret;@Value("${message.localURL}")private String localURL;@Value("${message.name}")private String name;@Value("${message.pwd}")private String pwd;

7.发送短信验证码

package cn.zhaocha.message;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;import cn.zhaocha.common.config.MessageConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;@Service
public class XiooMsgService {@Autowiredprivate MessageConfig messageConfig;private static Logger log = LoggerFactory.getLogger(XiooMsgService.class);public enum MsgResultCode {SUCCUSS("0", "提交成功"), SENSITIVE("1", "含有敏感词汇"), NO_MONEY("2", "余额不足"), NO_PHONE("3", "没有号码"), BAD_SQL("4", "包含sql语句"), NO_ACCOUNT("10","账号不存在"), ACCOUNT_DEAD("11", "账号注销"), ACCOUNT_STOP("12", "账号停用"), BAD_IP("13", "IP鉴权失败"), BAD_FORMAT("14", "格式错误"), SYSTEM_ERROR("-1", "系统异常");public static String codeOf(String paymentType) {for (MsgResultCode item : values()) {if (item.getCode().equals(paymentType)) {return item.getMsg();}}throw new RuntimeException("没有匹配的短信结果信息");}private String code;private String msg;public String getCode() {return code;}public String getMsg() {return msg;}MsgResultCode(String code, String msg) {this.code = code;this.msg = msg;}}public void sendSmsCode(String phone, String smsCode) {String content = new StringBuffer("您的验证码为" + smsCode + ",如非本人操作,请忽略本短信,本验证码有效时间5分钟。").toString();this.sendMsg(phone, content);}private void sendMsg(String phone, String msg) {if (StringUtils.isEmpty(phone) || !phone.startsWith("1")) {return;}String name = messageConfig.getName();String pwd = messageConfig.getPwd();StringBuffer mobileString = new StringBuffer(phone);String sign = "xx";String stime = "";StringBuffer extno = new StringBuffer();try {String resultStr = doPost(name, pwd, mobileString, msg, sign, stime, extno, messageConfig);log.info("短信 结果" + phone + "  " + resultStr);if (resultStr.contains(",")) {String result = resultStr.split(",")[0];log.info(result + "  " + MsgResultCode.codeOf(result));} else {log.info("短信 结果 没有逗号" + phone + "  " + resultStr);}} catch (Exception e) {log.info(e.toString());}}public static String doPost(String name, String pwd, StringBuffer mobileString, String contextString, String sign, String stime, StringBuffer extno,MessageConfig messageConfig) throws Exception {StringBuffer param = new StringBuffer();param.append("name=" + name);param.append("&pwd=" + pwd);param.append("&mobile=").append(mobileString);param.append("&content=").append(URLEncoder.encode(contextString.toString(), "UTF-8"));param.append("&stime=" + stime);param.append("&sign=").append(URLEncoder.encode(sign, "UTF-8"));param.append("&type=pt");param.append("&extno=").append(extno);// URL localURL = new URL("http://api.duanxin123.cn/asmx/smsservice.aspx?");URL localURL = new URL(messageConfig.getLocalURL());URLConnection connection = localURL.openConnection();HttpURLConnection httpURLConnection = (HttpURLConnection) connection;httpURLConnection.setDoOutput(true);httpURLConnection.setRequestMethod("POST");httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");httpURLConnection.setRequestProperty("Content-Length", String.valueOf(param.length()));OutputStream outputStream = null;OutputStreamWriter outputStreamWriter = null;InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader reader = null;String resultBuffer = "";try {outputStream = httpURLConnection.getOutputStream();outputStreamWriter = new OutputStreamWriter(outputStream);outputStreamWriter.write(param.toString());outputStreamWriter.flush();if (httpURLConnection.getResponseCode() >= 300) {throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());}inputStream = httpURLConnection.getInputStream();resultBuffer = convertStreamToString(inputStream);} finally {if (outputStreamWriter != null) {outputStreamWriter.close();}if (outputStream != null) {outputStream.close();}if (reader != null) {reader.close();}if (inputStreamReader != null) {inputStreamReader.close();}if (inputStream != null) {inputStream.close();}}return resultBuffer;}public static String convertStreamToString(InputStream is) {StringBuilder sb1 = new StringBuilder();byte[] bytes = new byte[4096];int size = 0;try {while ((size = is.read(bytes)) > 0) {String str = new String(bytes, 0, size, "UTF-8");sb1.append(str);}} catch (IOException e) {e.printStackTrace();} finally {try {is.close();} catch (IOException e) {e.printStackTrace();}}return sb1.toString();}}

7.在生成验证码的地方调用发送短信验证码

8.校验

String validateNumber="sms";
RedisLock redisLock=new RedisLock(redisTemplate,validateNumber,60000,10000);
String codeKey=redisLock.get("key:phone:code:"+userVo.getVerifyCode());
CodeVo codeVo= FastJsonUtil.jsonToBean(codeKey, CodeVo.class);
System.out.println(codeVo.getSmsCode());
if (!codeVo.getSmsCode().equalsIgnoreCase(userVo.getCode())) {return Tuple.createTuple(1, "验证码错误");
}

随机生成验证码及发送短信验证码相关推荐

  1. 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)

    获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...

  2. 阿里云短信验证码(发送短信验证码)

    注意:在需在阿里云短信服务处申请accessKeyId,accessKeySecret,还有短信名头,短信模板填入下方空处 首先创建一个随机生成二维码的工具类CodeUtils public clas ...

  3. php如何写短信验证码,php发送短信验证码

    原标题:php发送短信验证码 业务: 手机端点击发送验证码,请求发送到php端,由php调用榛子云短信http://smsow.zhenzikj.com的短信接口,生成验证码并发送. SDK下载: h ...

  4. php 发验证码,php发送短信验证码

    业务: 手机端点击发送验证码,请求发送到php端,由php调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 在"我的应 ...

  5. java发送短信验证码,java发送短信验证码

    业务: 手机端点击发送验证码,请求发送到java服务器端,由java调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 下载后的S ...

  6. python发送短信验证码_python发送短信验证码

    业务: 手机端点击发送验证码,请求发送到python端,由python调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 代码: ...

  7. python循环发送短信验证码_python发送短信验证码

    业务: 手机端点击发送验证码,请求发送到python端,由python调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 代码: ...

  8. 七牛云发送短信验证码

    近日在写app用户注册接口的时候,需要用到短信验证码,公司选择了七牛的短信验证码.在网上看了七牛的开发者文档,一脸茫然,百度了很久,发现网上阿里云的发送短信,但对于七牛的短信验证码没有具体的描述,困扰 ...

  9. 【生成短信验证码,发送短信】

    生成验证码 @Autowired private StringRedisTemplate redisTemplate;. @Value("${tx.cloud.sms.login.templ ...

最新文章

  1. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.1 引言...
  2. error java on syntax token_解决Java“syntax error on token enum”问题
  3. String转int,int转String
  4. python里的shell是什么_Python与shell的3种交互方式介绍
  5. String str 与 String str=new String() 区别
  6. SQL Server高级查询之T-SQL编程(流程控制语句)
  7. mysql bitmap实现_[MySQL] mysql中bitmap的简单运用
  8. react 富文本编辑器 react-draft-wysiwyg 的使用总结
  9. Mybatis-Plus 自定义 id 生成器
  10. 第一章:Html-超文本标记语言
  11. vs2015软件系统开源_2015年最佳开源游戏
  12. 本机电脑清除DNS缓存+浏览器清除DNS缓存
  13. 怎么样才算软件做得好?
  14. sql oracle 退格键,Oraclesqlplus中方向键、退格键的使用是怎样的? 爱问知识人
  15. nasm做一个简单的操作系统写字本(3)
  16. html单元格边框斜线,excel表头三斜线 将线条的两端放在单元格的边框上
  17. 新鲜出炉的点菜系统(附源码)
  18. 起风了数字简谱用计算机,起风了钢琴简谱-数字双手-买辣椒也用券 高橋優
  19. 嵌入式是什么 ?为什么要学好嵌入式呢?
  20. 信息无障碍研究机构---企业

热门文章

  1. 大虫罗德曼的打球视频
  2. 数据结构(16)队列的顺序存储结构
  3. 河海大学计算机专硕考研万字经验贴
  4. 测试管理之--团队管理和建设
  5. 模具设计的设计思路及方法
  6. 绿树阴浓夏日长,楼台倒影入池塘。
  7. Ubuntu18.04安装ROS Academy for Beginners
  8. 高光谱图像,多光谱图像,全色图像
  9. Tomcat 安装与配置 win10
  10. 语音学发音语音学笔记