<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><!--需要json字符串。导入json依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><!-- 短信包--><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.3</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>1.1.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
package com.example.demo.Util;
import java.util.Random;
public class CodeUtil {//使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符public static final String VERIFY_CODES = "1234567890";/*** 使用系统默认字符源生成验证码* @param verifySize    验证码长度* @return*/public static String generateVerifyCode(int verifySize){return generateVerifyCode(verifySize, VERIFY_CODES);}/*** 使用指定源生成验证码* @param verifySize    验证码长度* @param sources   验证码字符源* @return*/public static String generateVerifyCode(int verifySize, String sources){if(sources == null || sources.length() == 0){sources = VERIFY_CODES;}int codesLen = sources.length();Random rand = new Random(System.currentTimeMillis());StringBuilder verifyCode = new StringBuilder(verifySize);for(int i = 0; i < verifySize; i++){verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));}return verifyCode.toString();}public static void main(String[] args) {System.out.println(generateVerifyCode(4));}
}
package com.example.demo.Service;public interface RedisService {/*** 存储数据*/void set(String key, String value);/*** 获取数据*/String get(String key);/*** 设置超期时间*/boolean expire(String key, long expire);/*** 删除数据*/void remove(String key);/*** 自增操作* @param delta 自增步长*/Long increment(String key, long delta);
}
package com.example.demo.Service.Impl;import com.example.demo.Service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class RedisServiceImpl implements RedisService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void set(String key, String value) {stringRedisTemplate.opsForValue().set(key, value);}@Overridepublic String get(String key) {return stringRedisTemplate.opsForValue().get(key);}@Overridepublic boolean expire(String key, long expire) {return stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);}@Overridepublic void remove(String key) {stringRedisTemplate.delete(key);}@Overridepublic Long increment(String key, long delta) {return stringRedisTemplate.opsForValue().increment(key,delta);}
}
package com.example.demo.Util;import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;public class SmsTool {//产品名称:云通信短信API产品,开发者无需替换static final String product = "Dysmsapi";//产品域名,开发者无需替换static final String domain = "dysmsapi.aliyuncs.com";// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)static final String accessKeyId = "";static final String accessKeySecret = "";public static SendSmsResponse sendSms(String phone , String code) throws ClientException {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request = new SendSmsRequest();//必填:待发送手机号request.setPhoneNumbers(phone);//必填:短信签名-可在短信控制台中找到request.setSignName("");//必填:短信模板-可在短信控制台中找到request.setTemplateCode("");//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为request.setTemplateParam(code);//选填-上行短信扩展码(无特殊需求用户请忽略此字段)//request.setSmsUpExtendCode("90997");//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者//request.setOutId("yourOutId");//hint 此处可能会抛出异常,注意catchSendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);return sendSmsResponse;}
}
package com.example.demo.Controller;import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.example.demo.Service.RedisService;
import com.example.demo.Util.CodeUtil;
import com.example.demo.Util.SmsTool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;@Controller
@RequestMapping("/sms")
public class SmsController {/**** 注入redis模版*/@Autowiredprivate RedisService redisService;private  String tokenId="TOKEN-USER-";/*** 发送短信* @ResponseBody 返回json数据* @RequestMapping 拦截请求,指定请求类型:POST* @RequestBody 接受前台传入的json数据 接受类型为Map*/@ResponseBody@RequestMapping(value = "/smsXxs", method = RequestMethod.POST, headers = "Accept=application/json")public Map<String,Object> smsXxs(@RequestBody Map<String,Object> requestMap, HttpServletRequest request) throws ClientException {Map<String,Object> map = new HashMap<>();String phone = requestMap.get("phoneNumber").toString();// 调用工具栏中生成验证码方法(指定长度的随机数)String code = CodeUtil.generateVerifyCode(6);//填充验证码String TemplateParam = "{\"code\":\""+code+"\"}";SendSmsResponse response = SmsTool.sendSms(phone,TemplateParam);//传入手机号码及短信模板中的验证码占位符map.put("verifyCode",code);map.put("phone",phone);request.getSession().setAttribute("CodePhone",map);if( response.getCode().equals("OK")) {map.put("isOk","OK");//验证码绑定手机号并存储到redisredisService.set(tokenId+phone,code);redisService.expire(tokenId+phone,620);//调用reids工具类中存储方法设置超时时间}return map;}/*** 注册验证* @ResponseBody 返回json数据* @RequestMapping 拦截请求,指定请求类型:POST* @RequestBody 接受前台传入的json数据 接受类型为Map* @throws ClientException 抛出异常*/@ResponseBody@RequestMapping(value = "/validateNum", method = RequestMethod.POST, headers = "Accept=application/json")public Map<String, Object> validateNum(@RequestBody Map<String,Object> requestMap) throws ClientException {Map<String,Object> map = new HashMap<>();String phone = requestMap.get("phone").toString();//获取注册手机号码String verifyCode = requestMap.get("verifyCode").toString();//获取手机验证码//首先比对验证码是否失效String redisauthcode= redisService.get(tokenId+phone); //传入tonkenId返回redis中的valueif(StringUtils.isEmpty(redisauthcode)){//如果未取到则过期验证码已失效map.put("ruselt",404);}else  if(!"".equals(redisauthcode)&&!verifyCode.equals(redisauthcode)){//验证码错误map.put("ruselt",500);}else{//用户注册成功map.put("ruselt",200);}return map;}
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>短信验证码</title><script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<!--  <h3>springboot整合redis之用户手机验证码注册登录</h3>-->
<div class="form-group has-feedback"><input type="tel" class="form-control" id="phone" placeholder="请输入手机号" maxlength=11><span class="glyphicon glyphicon-earphone form-control-feedback"></span>
</div>
<div class="row"><div class="col-xs-6 pull_left"><div class="form-group"><input class="form-control" id="msg_num" placeholder="请输入验证码"></div></div><div class="col-xs-6 pull_center"><div class="form-group"><input type="button" class="btn btn-block btn-flat" id="verify_refresh" onclick="getMsgNum(this)" value="免费获取验证码"></div></div>
</div>
<div class="col-xs-12 pull_center"><button type="button" class="btn btn-block btn-flat" onclick="validateNum()">验证</button>
</div><!--js中的代码-->
<script>var messageData;var wait = 120; // 短信验证码120秒后才可获取下一个/*** 获取验证码*/function getMsgNum(that) {var phoneNumber = $('#phone').val();setButtonStatus(that); // 设置按钮倒计时var obj = {phoneNumber: phoneNumber};$.ajax({url: 'sms/smsXxs', // 后台短信发送接口type: 'POST',dataType: 'json',contentType: "application/json",async: false, //false 同步data: JSON.stringify(obj),xhrFields: { //为true实现跨域访问withCredentials: true},success: function (result) {if(result.isOk="OK") {alert("验证码发送成功");messageData = result;}else {alert("验证码发送失败")}},error: function (XMLHttpRequest, textStatus, errorThrown) {console.log(XMLHttpRequest.status);console.log(XMLHttpRequest.readyState);console.log(textStatus);}});}/*** 设置按钮状态*/function setButtonStatus(that) {if (wait == 0) {that.removeAttribute("disabled");that.value="免费获取验证码";wait = 60;} else {that.setAttribute("disabled", true);that.value=wait+"秒后可以重新发送";wait--;setTimeout(function() {setButtonStatus(that)}, 1000)}}/*** 注册按钮*/function validateNum() {var data = {// verifyCode: messageData.verifyCode,// phone: messageData.phone,verifyCode: $('#msg_num').val(),phone: $('#phone').val(),};$.ajax({url: 'sms/validateNum', // 后台短信发送接口type: 'POST',dataType: 'json',contentType: "application/json",async: false, //false 同步data: JSON.stringify(data),xhrFields: { //为true实现跨域访问withCredentials: true},success: function (result) {if(result.ruselt=="404") {alert("过期验证码已失效");}else if(result.ruselt=="500"){alert("验证码错误")}else{alert("验证成功");}},error: function (XMLHttpRequest, textStatus, errorThrown) {console.log(XMLHttpRequest.status);console.log(XMLHttpRequest.readyState);console.log(textStatus);}});}</script>
</body>
</html>

SpringBoot整合redis实现阿里云短信验证相关推荐

  1. springboot整合阿里云短信验证(无需签名和模板,通过阿里云api测试实现短信验证)

    一.开通阿里云短信服务 开通步骤如下图所示 开通完成后,进入阿里云短信验证首页,点击国内消息 一般来说,在短信验证时需要签名管理和模板管理,但是签名管理需要备案或者上线服务,所以对于没有备案和上线应用 ...

  2. springboot整合阿里云短信验证服务

    导入上面jar包 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sd ...

  3. 阿里云短信验证解决方案(java版)(redis存储)

    阿里云短信验证解决方案(java版)(redis存储) 参考文章: (1)阿里云短信验证解决方案(java版)(redis存储) (2)https://www.cnblogs.com/Amos-Tur ...

  4. 阿里云短信验证服务详细基础教程

    阿里云短信验证服务 1. 注册一个阿里云的帐号 2. 在搜索栏搜索短信服务 3. 点击免费开通 4.开通之后点击管理控制台 5. 获取AccessKey 6. 创建AccessKey并保存,后面会用到 ...

  5. 阿里云短信验证-PHP

    阿里云短信验证-PHP 场景:平台注册,登陆短信验证 参考阿里官方教程 阿里云短信验证-快速入门 前提条件: 产品->云计算产品->短信服务 开通短信服务 创建AccessKey 申请短信 ...

  6. java实现阿里云短信验证注册--详细教程

    java实现阿里云短信验证注册–详细教程 .项目中先引入依赖 <!--阿里云短信包--><dependency><groupId>com.aliyun</gr ...

  7. springboot 使用shiro集成阿里云短信验证码

    目录 1.阿里云短信验证码服务 2.发送短信验证码 3.shiro配置多个realm 4.验证短信验证码 5.一些修改思路 引言:短信验证码是通过发送验证码到手机的一种有效的验证码系统,主要用于验证用 ...

  8. SpringBoot 自定义Starter(阿里云短信、消息推送)

    首先在IDEA中创建SpringBoot项目,引入相关必要依赖,本次以阿里云短信/消息推送为例: <dependency><groupId>com.aliyun</gro ...

  9. 尚融宝——阿里云短信验证功能(sms)

    一.整合微服务 创建service-sms微服务 添加依赖: <!--阿里云短信--><dependency><groupId>com.aliyun</gro ...

最新文章

  1. Spring Security 入门(四):自定义-Filter
  2. Windows10下使用darknet和YOLOV3训练自己的数据集
  3. 单元测试之JUnit 5 参数化测试使用手册
  4. IntelliJ IDEA2017 修改缓存文件的路径
  5. 《动手学深度学习》第一天 (2.1+2.2)
  6. php如何封装类内乡通南阳的_PHP类(三)-类的封装
  7. 使用InstallShield下部署ASP.NET网站和MySQL,目标机为Win7——(二)使用InstallShield部署非安装版MySQL...
  8. linux的基本使用方法,Linux/Unix基本使用方法
  9. 电大数据库应用技术形考3_华为荣耀路由3体验:Wi-Fi6技术成熟应用,真正的平民好路由...
  10. [Java] 使用HttpClient实现文件下载
  11. 阵列卡u盘安装系统步骤_Dell的R720服务器使用U盘安装系统
  12. python接收163邮件以及下载附件(以163邮箱为例)
  13. Flink StreamingFileSink写入hdfs,文件一直处于inprogress
  14. CF1528B Kavi on Pairing Duty(dp)
  15. 魅蓝e格机解锁方法_魅蓝E手机锁屏密码忘了怎么办?忘了手机密码怎么办?
  16. 字符串的拼接需要间隔符的时候
  17. 工作常用的工具类JS+reset.css
  18. 【记录读论文时遇到的一些算法1】——MCMC sampling Gibbs sampling
  19. latex格式怎么引用文章
  20. 树莓派外设开发——超声波

热门文章

  1. NUIST第一届程序设计大赛团队赛试题
  2. 华为matebooke不能下python_为什么华为matebookE明明是64位配置装Pr之类的64位软件却显示32位无法安装64位?...
  3. mac下解压缩rar文件工具-rarosx(免费)
  4. 6.服务器安全攻防之MySQL账号扫描及攻击
  5. Android Camera v4l2 崩溃问题记录
  6. python操作hbase如何快速录入多条数据_python 数据库插入多行
  7. 关于华硕笔记本A400U进PE,改开机密码,硬盘无法识别的笔记
  8. 下列选项中能够实现python循环结构的是_模拟试卷B
  9. SQL 增删改查(学生、课程、选课表为例)
  10. watch 和 watchEffect 的区别