使用redis做缓存实现用户的注册功能:
异步请求发送短信,给 发送短信的按钮 绑定异步事件
调用发送短信逻辑发送短信
缓存 key1:验证码
缓存 key2:短信发送时刻的时间
用户提交表单 包含用户的基本信息+验证码
取出用户的验证码去redis中查找
若不存在返回异常
未过期,直接退出发短信的方法
存在根据key1取出验证码,和用户提交的比对,相同继续注册,否则返回异常
主要调用腾讯短信的接口实现如下:
```java
/**
* 发送短信的工具类
* @Author: Changwu
* @Date: 2019/5/25 14:00
*/
@Component
@EnableConfigurationProperties(SmsRepository.class)
public class SendSms {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
SmsRepository smsRepository;
@Autowired
StringRedisTemplate stringRedisTemplate;
private String msg;
/**
* 发送短信
* 查看redis缓存中是否存在未过期的验证码信息,
* 如果存在直接返回,拒绝发送验证码,
* 否则重新发送
* @param photoNumber
* @return 发送的验证码
*/
public String sendSms(String photoNumber){
String key=smsRepository.getPREFIX()+photoNumber;
String lastTime = stringRedisTemplate.opsForValue().get(key);
// 判断发送的时长
if (lastTime!=null){
Long aLong = Long.valueOf(lastTime);
logger.info("lastTime==="+aLong);
if (System.currentTimeMillis()-aLong<smsRepository.getExpireTime()){
logger.warn("手机号{},发送短信频率过高被拒绝..."+photoNumber);
return null;
}
}
// 生成随机数
this.msg=createRodom();
// 发送短信
String errmsg = send(photoNumber,msg);
if (!errmsg.equals("OK")){
this.msg=errmsg;
throw new RuntimeException("故意整出来的异常");
}
// 把发送短信的时间写入缓存
stringRedisTemplate.opsForValue().set(key,String.valueOf(System.currentTimeMillis()),smsRepository.getExpireTime()/1000, TimeUnit.SECONDS);
return msg;
}
```
```java
/**
* 发送
* @param phone
* @param msg
*/
public String send(String phone,String msg){
SmsSingleSenderResult result =null;
try {
String time = String.valueOf(smsRepository.getExpireTime()/60000);
// 模板需要的两个参数 , 验证码+过期时间
String[] params = {msg,time};
SmsSingleSender ssender = new SmsSingleSender(smsRepository.getAppid(), smsRepository.getAppkey());
// 单发短信
result = ssender.sendWithParam(
"86", // 国家码,如 86 为中国
phone, // 不带国家码的手机号
smsRepository.getTemplateId(), // 模板Id 指定信息内容
params, // 参数内容
smsRepository.getSmsSign(), // 签名, 如果为空,会使用默认的签名
"", // 扩展码,可填空
""); // 服务端原样返回的参数,可填空
} catch (HTTPException e) {
// HTTP响应码错误
e.printStackTrace();
} catch (JSONException e) {
// json解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络IO错误
e.printStackTrace();
}
// 保存验证码到redis
stringRedisTemplate.opsForValue().set(phone,msg,5,TimeUnit.SECONDS);
return result.errMsg;
}
 
// 创建六位随机数
public String createRodom(){
Random random = new Random();
String result="";
for (int i=0;i<6;i++)
{
result+=random.nextInt(10);
}
return result;
}
}
 
```
配置类如下:
```java
/**
* @Author: Changwu
* @Date: 2019/5/25 15:39
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
@ConfigurationProperties(prefix = "sms")
public class SmsRepository {
 
// 短信应用SDK AppID // 1400开头
private int appid ;
 
// 短信应用SDK AppKey
private String appkey ;
 
// 短信模板ID,需要在短信应用中申请
private int templateId ; // NOTE: 这里的模板ID`7839`只是一个示例,真实的模板ID需要在短信控制台中申请
 
// NOTE: 这里的签名"腾讯云"只是一个示例,真实的签名需要在短信控制台中申请,另外签名参数使用的是`签名内容`,而不是`签名ID`
private String smsSign;
 
// 缓存的前缀
private String PREFIX;
 
// 过期时间
private int expireTime;
}
```
  
配置文件
server:
port: 9999
spring:
redis:
host: 192.168.43.150
### 短信配置
sms:
appid: XXX #短信应用SDK AppID
appkey: XXX #短信应用SDK AppKey
templateId: 329108 # 短信模板ID,需要在短信应用中申请
smsSign: LFJHelper # 签名--自定义
expireTime: 60000 # 过期时间,默认六十秒
PREFIX: PHOTO_SMS # 缓存进redis的key
  

腾讯短信+SpringBoot+Redis实现注册逻辑的更多相关文章

  1. 腾讯短信平台ASP接口范例

    疫情后一个小项目要用到腾讯短信平台,因为比较老,用ASP写的,平台没有相应的ASP接口,百度不到,无奈之下自己写了一个,也方便需要的朋友们. 主要代码如下: <!--#include file= ...

  2. [权限管理系统(四)]-spring boot +spring security短信认证+redis整合

    [权限管理系统]spring boot +spring security短信认证+redis整合   现在主流的登录方式主要有 3 种:账号密码登录.短信验证码登录和第三方授权登录,前面一节Sprin ...

  3. JavaWeb-SpringBoot_使用MySQL管理用户登录注册+接入腾讯短信SDK_demo

    使用Gradle编译项目 传送门 项目已托管到Github上 传送门 JavaWeb-SpringBoot_一个类实现腾讯云SDK发送短信 传送门 用户注册 用户并非一定要输入正确的手机验证码去激活当 ...

  4. day80_10_29git冲突解决与短信服务redis

    一.开发中的操作. 在项目开发中,在工作区进行开发,开发结束后提交到本地版本库. 再拉取远程仓库,具体如下: """ 1.开发前,拉一次远程仓库 2.工作区进行开发 3. ...

  5. 腾讯短信服务精简版(PHP )

    短信视乎已经被慢慢淡出平常的交流工具队列,但始终抹不去它的存在,短信验证码视乎从未被取代,此外在重要的信息通知的地位也是不可取的的.所以了解短信的使用是开发中很有必要的一环. 腾讯云的短信服务提供有1 ...

  6. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  7. Luffy之注册认证(容联云通讯短信验证)

    用户的注册认证 前端显示注册页面并调整首页头部和登陆页面的注册按钮的链接. 注册页面Register,主要是通过登录页面进行改成而成. 先构造前端页面 <template> <div ...

  8. Java加腾讯云实现短信验证码功能

    一.概要 现如今在日常工作和生活中短信验证码对于我们来说是非常熟悉的,比较常见的注册账号或者交易支付时候,手机会收到一个短信验证码,我们可以通过验证码来有效验证身份,避免一些信息被盗. 验证身份 目前 ...

  9. java实现发短信功能---腾讯云短信

    目录 java实现发短信功能 前言 开发环境 腾讯云 ---短信 代码 效果 结束语 java实现发短信功能 前言 如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信 考察了 ...

随机推荐

  1. JSP注册登录页教程

    转载请标明原文地址:http://www.cnblogs.com/zhangyukof/p/6785258.html  一.准备工作 已搭建好的SSH框架工程一个,如果没有,请参考我的上一篇文章< ...

  2. Nginx入门简介和反向代理、负载均衡、动静分离理解

    场景 Nginx简介 Nginx ("engine x")是一个高性能的 HTTP 和反向代理服务器 特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页 ...

  3. kafka2.3.1+zookeeper3.5.6+kafka-manager2.0.0.2集群部署(centos7.7)

    一.准备三台服务器,配置好主机名和ip地址 二.服务器初始化:包括安装常用命令工具,修改系统时区,校对系统时间,关闭selinux,关闭firewalld,修改主机名,修改系统文件描述符,优化内核参数 ...

  4. centos安装redis并开启多个redis实例

    1.下载安装包       下载地址 :  http://download.redis.io/releases/,去里面找对应的版本下载        例如  wget http://download ...

  5. centos和rhel中软件包管理常用命令

    软件包管理的常用命令  rpm软件包的管理  查询类: rpm  -q 软件包的查询: rpm  -q  软件包的名字   //你的记住软件包完整名字 模糊查询:rpm  -qa  |  grep   ...

  6. filezilla无法登陆ubuntu虚拟机

    一般情况下,是新安装的虚拟机没有安装ssh造成的 进入虚拟机控制台,输入 sudo apt-get openssh-server 回车 等安装完成即可登陆.

  7. acwing 861. 二分图的最大匹配 模板

    地址  https://www.acwing.com/problem/content/description/863/ 给定一个二分图,其中左半部包含n1n1个点(编号1~n1n1),右半部包含n2n ...

  8. Spring Boot Failed to load resource: the server responded with a status of 404 ()

    出现错误: Failed to load resource: the server responded with a status of 404 () 但是其他页面正常显示: 原因: 浏览器看一下:  ...

  9. 整理h5移动端适配方案

    <使用Flexible实现手淘H5页面的终端适配>:https://github.com/amfe/article/issues/17 <再聊移动端页面的适配>:https:/ ...

  10. C#/.Net开发入门篇(3)——console类的输入输出

    相信看了我上一篇文章的小伙伴们都知道console这个类的最基本的2个方法了吧,下去练习过的小伙伴应该能知道4个方法. 那么下面我们就来介绍一下上期没有介绍完的另外2个方法Console.WriteL ...