使用阿里云实现短信验证码

news2024/11/14 4:20:15

首先去阿里云中开启短信服务

然后申请自己的签名,发送的短信模板,之后点击右上角的头像,点击AccessKey,选第一个就行,然后保存这两个对应的值。

 在等待签名和发送模板通过审核之后就可以配置我们的发送方法,我们使用的是redis来存储发送的验证,用来起到验证作用。在Maven中添加需要使用的jar包

 <!-- 短信验证码-->
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-core</artifactId>
			<version>4.4.0</version>
		</dependency>
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
			<version>1.0.0</version>
		</dependency>

 记得在添加自己redis的配置。

接下来是使用redis来存储数据的工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 读取缓存
     *
     * @param key
     * @return
     */
    public String get(final String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 写入缓存
     */
    public boolean set(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().set(key, value);
            redisTemplate.expire(key,1, TimeUnit.MINUTES); //一分钟过期
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 更新缓存
     */
    public boolean getAndSet(final String key, String value) {
        boolean result = false;
        try {
            redisTemplate.opsForValue().getAndSet(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 删除缓存
     */
    public boolean delete(final String key) {
        boolean result = false;
        try {
            redisTemplate.delete(key);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

然后是调用发送短信的类,在阿里云操作界面点击这个

需要填的值,填到下方代码的空缺位置即可。


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 com.example.ResumeIdentifySystem.uitl.RedisUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Message {
    @Autowired
    RedisUtils redisUtils;


    public static void messagePost(String u_phone, String message) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "填自己ID", "填自己Secret");
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", u_phone);
        request.putQueryParameter("SignName", "签名");
        request.putQueryParameter("TemplateCode", "******");
        request.putQueryParameter("TemplateParam", "{\"code\":" + message + "}");
        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }


    //获取验证码
    public String authcode_get(String u_phone) {
        if(redisUtils.get(u_phone)==null){
            String authcode = "1" + RandomStringUtils.randomNumeric(5);//生成随机数,我发现生成5位随机数时,如果开头为0,发送的短信只有4位,这里开头加个1,保证短信的正确性
            redisUtils.set(u_phone, authcode);//将验证码存入redis缓存
            Message.messagePost(u_phone, authcode);//发送短息
            return "验证码发送成功";
        }
       return "该手机号已经发送过验证码,验证码时间还未到期";
    }

    //验证码登录
    public String authcode_login(String u_phone, String authcode) {

        if (redisUtils.get(u_phone).equals(authcode)) {
            return "验证码正确,登录成功";
        }
        return "验证码错误,登录失败";
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Framework的重要性及其对行业前景的影响~

随着智能手机和移动应用的兴起&#xff0c;Android操作系统成为全球最大的移动操作系统&#xff0c;而Android Framework作为其核心组件之一&#xff0c;扮演着至关重要的角色。Android Framework提供了众多的API和工具&#xff0c;为开发者提供了构建功能丰富、高效稳定的Andr…

大厂月入3w+,失业焦虑折磨着我

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红书也叫这个名字。 周末和一位老朋友聚会&#xff0c;聊了聊一个很现实的收入问题&#xff0c;巧合的是&#xff1a;他的焦虑&#xff0c;竟然和月薪5k的我一模一样。 今天给大家分享一下。 1、外人看来&#xff0c;让人羡…

Scrpay框架之MongoDB--Index

目录 MongoDB-Index 概念 索引类型 创建索引 注意 样例 索引的查看 删除索引 语法 样例 检测索引的速度优势 Mongo-Unique Index And Compound Index 唯一索引&#xff08;Unique Index&#xff09; 添加唯一索引的语法 利用唯一索引进行数据去重 复合索引&a…

zkSync的ZK Stack:Hyperchains和Hyperbridges

1. 引言 ZK Stack有2个关键特性&#xff1a; sovereignty 主权&#xff1a;作为创建者&#xff0c;可对自己的链有完全的自由和权利来定制链的每一个方面。 Hyperchains独立运行&#xff0c;依赖以太坊L1来提供安全性和活性。 seamless connectivity 无缝连接。 Hyperbridges…

SolidWorks全球认证报名简章

SolidWorks CSWP专业认证考试 一、CSWP的起源 CSWP全名为Certified SolidWorks Professional &#xff0c;为SolidWorks原厂认证&#xff1b;在全球非常具有公信力。是健全与完整的3D CAD认证&#xff0c;相较于一般宣称是3D CAD认证&#xff0c;但是却没有投入完整的团队与完…

Barplot | 平平无奇的环形Barplot你掌握了吗!?~(附完整代码)

1写在前面 最近天天下雨&#xff0c;真是下得我没脾气啊&#xff0c;动不动就淋成狗。&#x1f62d; 下雨也就算了&#xff0c;还特别热。&#x1f912; 不知道是不是人到中年了&#xff0c;事情也特别的多&#xff0c;能静下心来思考的时间越来越少了。&#x1f61e; 也越来越…

SparkSQL与Hive整合(Spark On Hive)

1. Hive的元数据服务 hive metastore元数据服务用来存储元数据&#xff0c;所谓元数据&#xff0c;即hive中库、表、字段、字段所属表、表所属库、表的数据所在目录及数据分区信息。元数据默认存储在hive自带的Derby数据库。在内嵌模式和本地模式下&#xff0c;metastore嵌入在…

安装一个新虚拟环境——就叫它newtorch吧!

文章目录 1 新建一个虚拟环境newtorch2 安装pytorch1.7.1依赖包3 安装matplotlib2.2.34 安装torchsummary5 现在开始测试一下代码6 安装pandas 1 新建一个虚拟环境newtorch 打开anaconda prompt&#xff0c;输入&#xff1a; conda create -n newtorch python3.7.4// newtorc…

idea多模块测试——暂时不启动某个有问题的模块,之后再加载回来

文章目录 遇到问题解决方案暂时卸载然后还原 遇到问题 某个模块出了问题&#xff0c;运行不了项目 解决方案 暂时卸载 然后还原

云原生之深入解析Dapr安全性之访问控制策略

一、服务调用范围访问策略 ① 跨命名空间的服务调用 Dapr 通过服务调用 API 提供端到端的安全性&#xff0c;能够使用 Dapr 对应用程序进行身份验证并设置端点访问策略&#xff1a; Dapr 应用程序可以被限定在特定的命名空间&#xff0c;以实现部署和安全&#xff0c;当然仍然…

计算机基础知识学习笔记

目录 1.计算机奠基人—冯•诺依曼1.冯诺依曼结构2.冯诺依曼结构的特点 2.计算机的发展 感觉自己的计算机基础知识还很薄弱&#xff0c;工作之余补习一下。1.计算机奠基人—冯•诺依曼 1.冯诺依曼结构 冯诺依曼结构也称作普林斯顿结构&#xff0c;是一种将程序&#xff08;指令…

【C语言】大小端介绍以及判断大小端的两种方式

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f343;大家可以叫我小何或者小侠&#x1f343; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助更多人理解和学习&#x1f338; 花繁柳密处&#xff0c;拨…

【探索 Kubernetes|作业管理篇 系列 16】离线业务 Job、CronJob

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们讲解了 DaemonSet 控制器&#xff0c;相信你以及理解了其的工作过程&#xff0c;分为三部。一是&#xff0c;获取所有 Node 节点中的 Pod&#xff1b;二是&#xff0c;判断是否有符合 DaemonSet 管理的 Pod&a…

osg实现镜面成像、倒影效果

目录 1. 需求提出 2. 代码实现 3. 功能讲解 3.1. 设置地面半透明 3.2. 设置镜面倒影成像 3.3. 设置地面颜色 3.4. 设置相机初始位置 4. 总结 1. 需求提出 平时的业务需求&#xff0c;有时需要实现镜面成像、倒影效果&#xff0c;如下&#xff1a…

79、基于STM32单片机DHT11温湿度无线蓝牙手机APP监控报警系统(程序+原理图+PCB图+设计资料+参考论文+开题报告+元器件清单等)

摘 要 温湿度控制已成为当今社会研究的热门项目。是工农业生产过程中必须考虑的因素。作为最常见的被控参数。温度和湿度已经不再是相互独立的物理量&#xff0c;而应在系统中综合考虑。广泛应用于实验室、大棚、花圃、粮仓乃至土壤等各个领域。而传统的温湿度控制则利用湿度…

Qt QLineEdit篇

QLineEdit篇 【1】QLineEdit简介【2】QLineEdit常用方法【3】QLineEdit使用举例UI设计界面效果头文件源文件 PC饱和了&#xff0c;跟我学Qt比较实在&#xff0c;哈哈哈 【1】QLineEdit简介 QLineEdit是Qt框架中的一个类&#xff0c;用于创建一个文本输入框&#xff0c;允许用…

【WSN定位】基于蜣螂优化算法DBO的Dvhop定位算法 不同锚节点比例和不同通信半径情况下对比【Matlab代码#45】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. Dvhop定位算法2. 蜣螂优化算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. Dvhop定位算法 根据距离矢量和…

#systemverilog# 关于随机约束之 约束块

随机变量的值通过由约束块声明的约束表达式来确定。像任务、函数和变量一样,随机块是类的成员。在一个类中,约束块的名字必须是唯一的。 一 语法定义 声明约束块的语法如下: (1)constraint_identifier是约束块的名字。使用constraint_mode()(参见12.8节)方法,这个名字…

初步认识Java垃圾回收算法

GCRoot指被栈上直接或间接引用的对象&#xff0c;或被本地方法栈直接或间接引用的对象&#xff0c;或被方法区引用的对象。 被引用的对象是不能被删除的。 如果对象跟GCRoot并没有直接或间接相连的关系&#xff0c;那么这些对象就可以被删除了。 标记-清理&#xff1a;将需要删…

C++智能指针使用陷阱、shared_ptr实现

一 智能指针使用概述 1.使用场景 1.1 unique_ptr 1.1.1 概念 std::unique_ptr 是通过指针占有并管理另一对象&#xff0c;并在 unique_ptr 离开作用域时释放该对象的智能指针。 std::unique_ptr 常用于管理对象的生存期&#xff0c;包含&#xff1a; 通过正常退出和经由异…