登录实现短信验证码

原理说明

  • 在网站登录时经常会遇到短信验证码登录的情况,其原理如下:
  • 首先我们需要一个短信发送接口,前端发送手机号码到后端,后端随机生成一个验证码并存入redis,并且设置该key的过期时间。(这里可以用手机号做redis的key,保证数据的唯一性)
  • 然后后端将该验证码发送给当前的手机号。(第三方短信平台完成)
  • 用户拿到验证码后,将验证码发送给后端进行校验
  • 后端对传过来的验证码与redis中的进行比较,如果相同就删掉,防止可以校验多次

开发环境

  • idea
  • springboot2.0
  • redis
  • 阿里云短信接口
     

具体实现过程chuachuang

controller类

 application.yaml类

配置redis

 

@Bean
@Primary    //若有相同类型的Bean时,优先使用此注解标注的Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 为了开发方便,一般直接使用<String, Object>RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);// 配置具体的序列化方式// JSON解析任意对象Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);// 设置日期格式om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));jackson2JsonRedisSerializer.setObjectMapper(om);// String的序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();//key采用String的序列化template.setKeySerializer(stringRedisSerializer);//hash的key也采用String的序列化template.setHashKeySerializer(stringRedisSerializer);//value的序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);//hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//设置所有配置template.afterPropertiesSet();return template;
}

创建控制类

package com.xja.sms;import com.xja.pojo.User;import java.util.Random;public class Sample {/*** 使用AK&SK初始化账号Client* @param accessKeyId* @param accessKeySecret* @return Client* @throws Exception*/public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()// 必填,您的 AccessKey ID.setAccessKeyId(accessKeyId)// 必填,您的 AccessKey Secret.setAccessKeySecret(accessKeySecret);// 访问的域名config.endpoint = "dysmsapi.aliyuncs.com";return new com.aliyun.dysmsapi20170525.Client(config);}/*** 使用STS鉴权方式初始化账号Client,推荐此方式。* @param accessKeyId* @param accessKeySecret* @param securityToken* @return Client* @throws Exception*/public static com.aliyun.dysmsapi20170525.Client createClientWithSTS(String accessKeyId, String accessKeySecret, String securityToken) throws Exception {com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()// 必填,您的 AccessKey ID.setAccessKeyId(accessKeyId)// 必填,您的 AccessKey Secret.setAccessKeySecret(accessKeySecret)// 必填,您的 Security Token.setSecurityToken(securityToken)// 必填,表明使用 STS 方式.setType("sts");// 访问的域名config.endpoint = "dysmsapi.aliyuncs.com";return new com.aliyun.dysmsapi20170525.Client(config);}public static void main(String[] args_) throws Exception {java.util.List<String> args = java.util.Arrays.asList(args_);// 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.htmlcom.aliyun.dysmsapi20170525.Client client = Sample.createClient("LTAI5tGStQ3nEGdUvxf3b4kL", "x1z5uPjvGYSsJo5j2vVmErd90EhYtf");String phone="13461698872";int code=new Random().nextInt(9000)+1000;com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest().setSignName("阿里云短信测试").setTemplateCode("SMS_154950909").setPhoneNumbers("13461698872").setTemplateParam("{\"code\":"+code+"}");com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();com.aliyun.dysmsapi20170525.models.SendSmsResponse resp = client.sendSmsWithOptions(sendSmsRequest, runtime);com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp));}public static void sendSms(String phone, String phoneCode) {// 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.htmlcom.aliyun.dysmsapi20170525.Client client = null;try {client = Sample.createClient("LTAI5tGStQ3nEGdUvxf3b4kL", "x1z5uPjvGYSsJo5j2vVmErd90EhYtf");com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest().setSignName("阿里云短信测试").setTemplateCode("SMS_154950909")

本文链接:https://my.lmcjl.com/post/19948.html

展开阅读全文

4 评论

留下您的评论.