基于SpringBoot和Redis实现短信验证码功能 |
您所在的位置:网站首页 › 短信随机码验证 › 基于SpringBoot和Redis实现短信验证码功能 |
听说微信搜索《Java鱼仔》会变更强哦! 本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)概述在日常使用各种app或者登陆网站的时候,基本都会看到短信验证码这个功能,实现短信验证码的方式有很多,这里给出基于SpringBoot和Redis的短信验证码实现方式。源码在文末 (二)思路把一切都简化,短信验证码的实现无法就是下面几点: 1、后端随机生成短信验证码,并在服务器端保存一定时间(一般是5分钟)。 2、将短信验证码发给用户。 3、用户输入短信验证码提交后,在后端与之前生成的短信验证码作比较,如果相同说明验证成功,否则验证失败。 其中在服务器端保存一定时间的这个操作我一下子就想到了redis,那就用redis来实现吧! 如果你还不熟悉如何在SpringBoot中使用redis,可以快速翻阅一下我之前的一篇文章: redis入门到精通系列(十):springboot集成redis及redis工具类的编写 (三)搭建项目首先搭建一个SpringBoot项目,这一步就不讲了,如果你还有问题可以直接看我的SpringBoot系列。 3.1 引入依赖 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web这里只需要引入上面三个依赖即可。 3.2 配置Controller新建一个包叫Controller,新建类IndexController,编写一个简单的首页跳转: @Controller public class IndexController { @RequestMapping(value = {"/","/index"},method = RequestMethod.GET) public String index(){ return "index"; } }此时,如果访问ip:端口/或者ip:端口/index,就会跳转到index.html这个页面上去。 3.3 编写index.html这个页面只需要包含两个按钮和一个输入框即可,页面放在resources/templates下 Title 发送验证码 验证到这里一个简单的项目前期搭建就完成了,访问一下: (四)核心功能实现 4.1 配置redisredis在正式使用前需要编写一个配置类,我在redis系列的博客中都有写,这里就直接用了,新建一个包叫做config,新建类RedisConfig,这个类主要是让redis在传输过程中不会乱码。 @Configuration public class RedisConfig { //自定义的redistemplate @Bean(name = "redisTemplate") public RedisTemplate redisTemplate(RedisConnectionFactory factory){ //创建一个RedisTemplate对象,为了方便返回key为string,value为Object RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(factory); //设置json序列化配置 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper=new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance); //string的序列化 StringRedisSerializer stringRedisSerializer=new StringRedisSerializer(); //key采用string的序列化方式 template.setKeySerializer(stringRedisSerializer); //value采用jackson的序列化方式 template.setValueSerializer(jackson2JsonRedisSerializer); //hashkey采用string的序列化方式 template.setHashKeySerializer(stringRedisSerializer); //hashvalue采用jackson的序列化方式 template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } } 4.2 发送验证码功能的实现发送验证码的思路就是生成验证码,存储验证码,通过短信接口发送验证码。这里的短信接口市面上有很多,使用起来无非就是一个get或者post请求,我这里就用控制台输出代替了。 在IndexController增加一个接口,用于发送短信验证码: @Controller public class IndexController { @Autowired private RedisTemplate redisTemplate; @RequestMapping(value = {"/","/index"},method = RequestMethod.GET) public String index(){ return "index"; } @ResponseBody @RequestMapping(value = "/sendmessage",method = RequestMethod.GET) public String sendmessage(){ //这里的userId在真实业务中通过个人身份的令牌获取,这里直接仿造一个 String userId="1"; //生成六位数随机验证码 String code=getCode(); //设置redis的key,这里设置为项目名:使用的字段:用户Id String redisKey="VERIFATIONCODE:CODE:"+userId; //将这个验证码存入redis中,并设置失效时间为5分钟 redisTemplate.opsForValue().set(redisKey,code,300, TimeUnit.SECONDS); //发送短信 boolean isSuccess=send(code); if (isSuccess){ return "success"; }else { return "fail"; } } private boolean send(String code) { String msg="验证码为:"+code+",验证码有效期5分钟,请及时验证"; System.out.println(msg); return true; } //生成六位随机验证码 private static String getCode() { Random random = new Random(); String result=""; for (int i=0;i Title 发送验证码 验证 sendmessage=()=>{ var resultjson; $.ajax( { url: "http://localhost:8080/sendmessage", type: "GET", async:false, dataType:'text', success: function (result) { resultjson=result; }, error: function ( status) { console.log("error") } }); if (resultjson=='success'){ alert("短信发送成功"); }else{ alert("短信发送失败,请联系管理员处理") } } 4.4 验证短信验证码在IndexController中再增加一个接口用来验证,逻辑就是把redis中存在的值和输入值进行比较 @ResponseBody @RequestMapping(value = "/checkCode",method = RequestMethod.GET) public String checkCode(@RequestParam("inputCode") String inputCode){ String userId="1"; //设置redis的key,这里设置为项目名:使用的字段:用户Id String redisKey="VERIFATIONCODE:CODE:"+userId; String realCode= (String) redisTemplate.opsForValue().get(redisKey); if (realCode!=null&&realCode.equals(inputCode)){ return "success"; }else { return "fail"; } }还是一样给验证按钮也加一个点击事件,checkCode方法加到sendmessage方法后。 验证 checkCode=()=>{ var resultjson; var input_code=$("#input_code").val(); $.ajax({ url: "http://localhost:8080/checkCode", type: "GET", async:false, dataType:'text', data:{inputCode:input_code}, success: function (result) { resultjson=result; }, error: function ( status) { console.log("error") } }); if (resultjson=='success'){ alert("验证成功"); }else{ alert("验证失败,验证码错误") } } (五)效果展现首先点击发送验证码,页面上弹出短信发送成功,后台接收到验证码: 观察redis中的数据 首先输入一个错误的数据 再输入一个正确的数据 最后给出源码:项目源码 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |