springboot+redis+阿里云短信实现手机号登录功能

 更新时间:2024年01月03日 10:15:27   作者:小 王  
这篇文章主要介绍了springboot+redis+阿里云短信实现手机号登录功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Springboot+Redis实现短信验证码发送功能

1.准备工作

1.1安装Redis

如果是开始学习的话建议安装到自己本机环境下,Redis安装

1.2 准备一个阿里云账户

这里以阿里云为例

登录到阿里云平台后获取AccessKey

创建用户组和用户(记得用户创建完成后保存用户信息后面会用到,切记一定一定一定要保存好用户信息,防止泄露)

添加短信服务权限

开通阿里云短信服务在短信服务控制台添加短信服务签名、模板,等待审核完成即可

2.创建工程

创建Springboot项目这里jdk版本为1.8,添加以下依赖即可

2.修改pom文件

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.6.3</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.4</version>
</dependency>

3.配置yml文件

server:
  port: 8080
spring:
  redis:
    host: localhost
    port: 6379
aliyun:
  accessKeyID: 自己的accessKeyID
  accessKeySecret: 自己的accessKeySecret

4.测试,可以打开test测试一下是否可以发送成功,直接复制到IDEA中,修改部分参数即可进行测试

import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
class SmsApplicationTests {
    @Test
    void sendSms() {
        // 指定地域名称 短信API的就是 cn-hangzhou 不能改变  后边填写您的  accessKey 和 accessKey Secret
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "accessKey", "accessKey Secret");
        IAcsClient client = new DefaultAcsClient(profile);
        // 创建通用的请求对象
        CommonRequest request = new CommonRequest();
        // 指定请求方式
        request.setMethod(MethodType.POST);
        // 短信api的请求地址  固定
        request.setDomain("dysmsapi.aliyuncs.com");
        // 签名算法版本  固定
        request.setVersion("2017-05-25");
        //请求 API 的名称。
        request.setAction("SendSms");
        // 上边已经指定过了 这里不用再指定地域名称
		//request.putQueryParameter("RegionId", "cn-hangzhou");
        // 您的申请签名
        request.putQueryParameter("SignName", "自己的签名");
        // 您申请的模板 code
        request.putQueryParameter("TemplateCode", "模板号");
        // 要给哪个手机号发送短信  指定手机号
        request.putQueryParameter("PhoneNumbers", "用于测试的手机号");
        // 创建参数集合
        Map<String, Object> params = new HashMap<>();
        // 生成短信的验证码  
        String code = String.valueOf(Math.random()).substring(3, 9);
        // 这里的key就是短信模板中的 ${xxxx}
        params.put("code", code);
        // 放入参数  需要把 map转换为json格式  使用fastJson进行转换
        request.putQueryParameter("TemplateParam", JSON.toJSONString(params));
        try {
            // 发送请求 获得响应体
            CommonResponse response = client.getCommonResponse(request);
            // 打印响应体数据
            System.out.println(response.getData());
            // 打印 请求状态 是否成功
            System.out.println(response.getHttpResponse().isSuccess());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

5.测试通过后就可以进行业务层的实现了

项目结构如下

3.代码实现

3.1 service层

创建一个SendSmsService接口用于对外提供方法

public interface SendSmsService {
    /**
     * 发送验证码
     * @param phoneNum 手机号
     * @param code 验证码
     * @return
     */
    boolean sendSms(String phoneNum,String code);
}

实现SendSmsService接口

import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.example.sms.service.SendSmsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class SendSmsServiceImp implements SendSmsService {
    private static final Logger LOGGER= LoggerFactory.getLogger(SendSmsServiceImp.class);
    //采用注入的方式传递参数
    @Value("${aliyun.accessKeyID}")
    private String accessKeyID;
    @Value("${aliyun.accessKeySecret}")
    private String accessKeySecret;
    @Override
    public boolean sendSms(String phoneNum, String code) {
        DefaultProfile profile=DefaultProfile.getProfile("cn-hangzhou", accessKeyID,accessKeySecret);
        IAcsClient client=new DefaultAcsClient(profile);
        CommonRequest request=new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("SignName", "自己的签名");
        request.putQueryParameter("PhoneNumbers", phoneNum);
        request.putQueryParameter("TemplateCode", "模板号");
        Map<String,Object> param=new HashMap<>();
        param.put("code", code);
        request.putQueryParameter("TemplateParam", JSON.toJSONString(param));
        try {
            CommonResponse response=client.getCommonResponse(request);
            //System.out.println(response.getData());//返回的消息
            LOGGER.info(JSON.parseObject(response.getData(), Map.class).get("Message").toString());
            return response.getHttpResponse().isSuccess();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}

3.2 controller层

import com.aliyuncs.utils.StringUtils;
import com.example.sms.service.SendSmsService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@RestController
@CrossOrigin//跨域支持
public class SendSmsController {
    @Resource
    private SendSmsService sendSmsService;
    @Resource
    private RedisTemplate redisTemplate;
    @GetMapping("/sendSms")
    public String sendSms(@RequestParam("phoneNum")String phoneNum){
        //获取到操作String的对象
        ValueOperations<String,String> value = redisTemplate.opsForValue();
        //根据手机号查询
        String phone = value.get(phoneNum);
        //如果手机号在redis中不存在的话才进行验证码的发送
        if (StringUtils.isEmpty(phone)){
            //生成6位随机数
            String code = String.valueOf(Math.random()).substring(3, 9);
            //调用业务层
            boolean sendSmsFlag = sendSmsService.sendSms(phoneNum, code);
            if (sendSmsFlag){
                // 发送成功之后往redis中存入该手机号以及验证码 并设置超时时间 5 分钟
                redisTemplate.opsForValue().set(phoneNum,code, 5, TimeUnit.MINUTES);
            }
            return "发送验证码到:" + phoneNum + "成功! " + "Message:" + sendSmsFlag;
        }else {
            return "该手机号:" + phoneNum + " 剩余:" + redisTemplate.getExpire(phoneNum) + "秒后可再次进行发送!";
        }
    }
    @GetMapping("/checkCode/{key}/[code]")
    public String checkCode(@PathVariable("key") String number,
                            @PathVariable("code")String code){
        //获取到操作String的对象
        ValueOperations<String,String> value = redisTemplate.opsForValue();
        //根据key值查询
        String redisCode = value.get(number);
        if (code.equals(redisCode)){
            return "成功";
        }
        return redisCode==null ? "请先获取验证码在进行校验!" : "错误";
    }
}

4. 测试

由于没有前端页面,我们借助postman工具来进行发送验证码功能

此时手机上收到的验证码

redis中的数据

以上便是一个简单的短信验证码的发送实现,注意一定一定一定要保护好自己的AccessKey

源码:gitee仓库

到此这篇关于springboot+redis+阿里云短信实现手机号登录的文章就介绍到这了,更多相关springboot redis阿里云短信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用OTP动态口令(每分钟变一次)进行登录认证

    Java使用OTP动态口令(每分钟变一次)进行登录认证

    这篇文章主要介绍了Java使用OTP动态口令(每分钟变一次)进行登录认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java实现折半插入排序算法的示例代码

    Java实现折半插入排序算法的示例代码

    折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。不断的依次将元素插入前面已排好序的序列中。本文将利用Java语言实现这一排序算法,需要的可以参考一下
    2022-08-08
  • java制作带界面的聊天工具

    java制作带界面的聊天工具

    这篇文章主要教大家如何利用java制作带界面的聊天工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 使用Spring boot 的profile功能实现多环境配置自动切换

    使用Spring boot 的profile功能实现多环境配置自动切换

    这篇文章主要介绍了使用Spring boot 的profile功能实现多环境配置自动切换的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-11-11
  • springboot-启动bean冲突的解决

    springboot-启动bean冲突的解决

    这篇文章主要介绍了springboot-启动bean冲突的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringCloud Gateway的熔断限流配置实现方法

    SpringCloud Gateway的熔断限流配置实现方法

    Spring Cloud Gateway支持通过配置熔断和限流机制来保证服务的稳定性和可用性,可通过Hystrix和Resilience4j两种方式实现。Hystrix通过注解和配置文件实现熔断限流,Resilience4j通过编程式配置实现
    2023-04-04
  • Java第三方库JodaTime的具体使用

    Java第三方库JodaTime的具体使用

    本文主要介绍了Java第三方库JodaTime的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • springboot中pom.xml文件注入test测试依赖时报错的解决

    springboot中pom.xml文件注入test测试依赖时报错的解决

    这篇文章主要介绍了springboot中pom.xml文件注入test测试依赖时报错的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 解决Lombok注解不起作用的问题

    解决Lombok注解不起作用的问题

    这篇文章主要介绍了解决Lombok注解不起作用的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • JAVA验证身份证号码有效性的实例代码

    JAVA验证身份证号码有效性的实例代码

    很多项目业务都会设计到人员信息,那么身份证号就是必不可少的校验项,下面这篇文章主要给大家介绍了关于JAVA验证身份证号码有效性的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论