使用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. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  2. 简单学习【1】——打包JS

    webpack entry <entry> output webpack --config webpack.conf.js Step1:新建一个文件,里面有一个app.js 一个sum.j ...

  3. mysql统计天、周、月、季度、半年、年

    之前在网上搜索按时间统计,发现不是很全 ,接着别人的思路进行延伸下, mysql统计天.周.月.季度.半年.年 前期工作创建辅助表 CREATE TABLE num (i INT); ),(),(), ...

  4. GHOST CMS -上下文概述 Context Overview

    Context Overview上下文概述 Each page in a Ghost theme belongs to a context, which determines which templa ...

  5. c++之运算符

    运算符分为:算数运算符.赋值运算符.比较运算符.逻辑运算符 算数运算符:+(正) -(负) + - * / % i++(先赋值后自增) ++i(先自增后赋值) i--(先赋值后自减) --i(先自减后 ...

  6. 使用Power BI Desktop 制作并发布到Power BI 服务,使用Power BI Mobile查询报表

    上节内容中,我们介绍了Power BI的基本概念,本节我们分享以下一个简单报表从使用Power BI Desktop制作,到发布到Power BI 服务,到从Power BI Mobile上查阅报表的 ...

  7. 如何在云服务器上自动运行.py文件

    如果你在云服务器上运行的目的是保持一直运行,那就继续往下看吧. 有很多种方法,我这里说的是在linux上操作的一种. 利用screen会话分离. 因为在Screen环境下,所有的会话都独立的运行,并拥 ...

  8. PlayJava SSM框架简介

    SSM框架 SSM是Spring + Spring MVC + MyBatis的缩写,是一个继SSH之后目前比较主流的JavaEE框架,适用于搭建各种企业级应用系统. Spring Spring是一个 ...

  9. Crow’s Foot Notation

    http://www2.cs.uregina.ca/~bernatja/crowsfoot.html Crow’s Foot Notation A number of data modeling te ...

  10. 阿里云esc 安装 mysql8.0

    打开 连接工具,我用的是 MobaXterm_Personal_12.1 (官网下载地址:https://moba.en.softonic.com/) 连接到 ecs,然后移除 默认的 mariadb ...