随机生成验证码及发送短信验证码
验证码
包括过期时间和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, "验证码错误");
}
随机生成验证码及发送短信验证码相关推荐
- 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)
获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...
- 阿里云短信验证码(发送短信验证码)
注意:在需在阿里云短信服务处申请accessKeyId,accessKeySecret,还有短信名头,短信模板填入下方空处 首先创建一个随机生成二维码的工具类CodeUtils public clas ...
- php如何写短信验证码,php发送短信验证码
原标题:php发送短信验证码 业务: 手机端点击发送验证码,请求发送到php端,由php调用榛子云短信http://smsow.zhenzikj.com的短信接口,生成验证码并发送. SDK下载: h ...
- php 发验证码,php发送短信验证码
业务: 手机端点击发送验证码,请求发送到php端,由php调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 在"我的应 ...
- java发送短信验证码,java发送短信验证码
业务: 手机端点击发送验证码,请求发送到java服务器端,由java调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 下载后的S ...
- python发送短信验证码_python发送短信验证码
业务: 手机端点击发送验证码,请求发送到python端,由python调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 代码: ...
- python循环发送短信验证码_python发送短信验证码
业务: 手机端点击发送验证码,请求发送到python端,由python调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. 代码: ...
- 七牛云发送短信验证码
近日在写app用户注册接口的时候,需要用到短信验证码,公司选择了七牛的短信验证码.在网上看了七牛的开发者文档,一脸茫然,百度了很久,发现网上阿里云的发送短信,但对于七牛的短信验证码没有具体的描述,困扰 ...
- 【生成短信验证码,发送短信】
生成验证码 @Autowired private StringRedisTemplate redisTemplate;. @Value("${tx.cloud.sms.login.templ ...
最新文章
- 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.1 引言...
- error java on syntax token_解决Java“syntax error on token enum”问题
- String转int,int转String
- python里的shell是什么_Python与shell的3种交互方式介绍
- String str 与 String str=new String() 区别
- SQL Server高级查询之T-SQL编程(流程控制语句)
- mysql bitmap实现_[MySQL] mysql中bitmap的简单运用
- react 富文本编辑器 react-draft-wysiwyg 的使用总结
- Mybatis-Plus 自定义 id 生成器
- 第一章:Html-超文本标记语言
- vs2015软件系统开源_2015年最佳开源游戏
- 本机电脑清除DNS缓存+浏览器清除DNS缓存
- 怎么样才算软件做得好?
- sql oracle 退格键,Oraclesqlplus中方向键、退格键的使用是怎样的? 爱问知识人
- nasm做一个简单的操作系统写字本(3)
- html单元格边框斜线,excel表头三斜线 将线条的两端放在单元格的边框上
- 新鲜出炉的点菜系统(附源码)
- 起风了数字简谱用计算机,起风了钢琴简谱-数字双手-买辣椒也用券 高橋優
- 嵌入式是什么 ?为什么要学好嵌入式呢?
- 信息无障碍研究机构---企业