手机短信注册验证与登录功能

news2024/10/7 8:32:07

文章目录

    • 一、前言
    • 二、准备工作
    • 三、发布短信
      • 1、基本测试发布
        • ①可-使用测试模板进行调试
        • ②测试结果
        • ③注意,可能会调试失败,是因为没有余额。进入首页点击头像>进入余额充值;一条大概4分钱
        • ④创建SpringBoot项目demo
    • 2、可自定义模板,发布短信功能
        • ①可-新建签名
        • ②新建模板
        • 可完成 手机短信注册验证与登录功能。

一、前言

通过手机短信发送验证码,是最普遍、最安全验证用户真实身份的方式,目前,短信验证码广泛应用于用户注册、密码找回、登录保护、身份认证、随机密码、交易确认等应用场景。本文通过调用API开发一个短信验证码为例,带您了解如何实现短信验证码功能。

二、准备工作

两步即可,本次以阿里云为例。第一步,在阿里云开通短信服务,第二步,创建一个简单的springboot的项目。
1、注册阿里云并完成实名认证
阿里云地址:https://www.aliyun.com/
2、创建AccessKey
在这里插入图片描述

3、搜索短信服务
在这里插入图片描述

4、点击同意-并控制台开通短信服务
在这里插入图片描述

三、发布短信

1、基本测试发布

①可-使用测试模板进行调试

在这里插入图片描述

②测试结果

在这里插入图片描述

③注意,可能会调试失败,是因为没有余额。进入首页点击头像>进入余额充值;一条大概4分钱

在这里插入图片描述

在这里插入图片描述

④创建SpringBoot项目demo

引入jar包

   <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibabacloud-dysmsapi20170525</artifactId>
            <version>2.0.22</version>
        </dependency>

创建类SendSms
注意,代码中输入自己的accessKeyId,accessKeySecret。在第2步 创建AccessKey点击查看Secret获取

package com.hn.yuan.controller;


import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.core.http.HttpClient;
import com.aliyun.core.http.HttpMethod;
import com.aliyun.core.http.ProxyOptions;
import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder;
import com.aliyun.sdk.service.dysmsapi20170525.models.*;
import com.aliyun.sdk.service.dysmsapi20170525.*;
import com.google.gson.Gson;
import darabonba.core.RequestConfiguration;
import darabonba.core.client.ClientOverrideConfiguration;
import darabonba.core.utils.CommonUtil;
import darabonba.core.TeaPair;

//import javax.net.ssl.KeyManager;
//import javax.net.ssl.X509TrustManager;
import java.net.InetSocketAddress;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;

public class SendSms {
    public static void main(String[] args) throws Exception {

        // HttpClient Configuration
        /*HttpClient httpClient = new ApacheAsyncHttpClientBuilder()
                .connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds
                .responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds
                .maxConnections(128) // Set the connection pool size
                .maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds
                // Configure the proxy
                .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<your-proxy-hostname>", 9001))
                        .setCredentials("<your-proxy-username>", "<your-proxy-password>"))
                // If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true))
                .x509TrustManagers(new X509TrustManager[]{})
                .keyManagers(new KeyManager[]{})
                .ignoreSSL(false)
                .build();*/

        // Configure Credentials authentication information, including ak, secret, token
        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
                .accessKeyId("<your-accessKeyId>")
                .accessKeySecret("<your-accessKeySecret>")
                //.securityToken("<your-token>") // use STS token
                .build());

        // Configure the Client
        AsyncClient client = AsyncClient.builder()
                .region("cn-hangzhou") // Region ID
                //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
                .credentialsProvider(provider)
                //.serviceConfiguration(Configuration.create()) // Service-level configuration
                // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("dysmsapi.aliyuncs.com")
                        //.setConnectTimeout(Duration.ofSeconds(30))
                )
                .build();

        // Parameter settings for API request
        SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
                .signName("阿里云短信测试")
                .templateCode("模板code")
                .phoneNumbers("手机号")
                .templateParam("{\"code\":\"6666\"}")
                // Request-level configuration rewrite, can set Http request parameters, etc.
                // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
                .build();

        // Asynchronously get the return value of the API request
        CompletableFuture<SendSmsResponse> response = client.sendSms(sendSmsRequest);
        // Synchronously get the return value of the API request
        SendSmsResponse resp = response.get();
        System.out.println(new Gson().toJson(resp));
        // Asynchronous processing of return values
        /*response.thenAccept(resp -> {
            System.out.println(new Gson().toJson(resp));
        }).exceptionally(throwable -> { // Handling exceptions
            System.out.println(throwable.getMessage());
            return null;
        });*/

        // Finally, close the client
        client.close();
    }

}

2、可自定义模板,发布短信功能

①可-新建签名

在这里插入图片描述

审核中,一般需要 2 小时左右!防止非法发送短信骚扰他人! 审核不通过,换个名称:“杭州快餐店”重新审核。

②新建模板

发送短信的内容模版,都是有严格要求的,不能涉及到违反互联网规定的法律条款
在这里插入图片描述

审核中,一般需要 2 小时左右!禁止非法发送短信骚扰他人!严厉禁止群发黄赌毒信息!

可完成 手机短信注册验证与登录功能。

String code =(int)(Math.random()*1000000)+“”; //随机产生一个 6 位数;
通过监听器@JmsListener,当用户输入的数字和通过Redis中缓存进行验证,是否一致。

部分代码

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

监听代码

package com.hn.yuan.controller;

import darabonba.core.exception.ClientException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MyListener {

    @Autowired
    private SendSms sendSms;

    @JmsListener(destination = "yuan")
    public void getMessage(String phone){
        try {
            sendSms.getsendSms(phone); //通知发送短信代码
        }catch (ClientException e){
            e.printStackTrace();
        }
    }

}

前端调用控制层方法

package com.hn.yuan.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/jms")
public class JmsController {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @RequestMapping("/send")
    public String senMsg(String phone){
        jmsMessagingTemplate.convertAndSend("yuan",phone);
        return phone;
    }
}

在这里插入图片描述

各位看官》创作不易,点个赞!!!
诸君共勉:万事开头难,只愿肯放弃。

免责声明:本文章仅用于学习参考

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

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

相关文章

[acwing周赛复盘] 第 78 场周赛20221119

[acwing周赛复盘] 第 78 场周赛20221119 一、本周周赛总结二、4719. 商品种类1. 题目描述2. 思路分析3. 代码实现三、4720. 字符串1. 题目描述2. 思路分析3. 代码实现四、4721. 排队1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 这周蛮简单的。T2 栈的应用…

Kafka - Kafka应用场景|基础架构|Windows安装|命令行操作

文章目录1. 消息队列的应用场景2. 消息队列的两种模式3. Kafka 的基础架构4. Kafka 的安装5. Kafka 命令行操作1. 主题命令行操作2. 生产者命令行操作3. 消费者命令行操作1. 消息队列的应用场景 传统的消息队列的主要应用场景包括&#xff1a;缓存/消峰、解耦和异步通信。 ①…

Packet Tracer - 配置多区域 OSPFv3

地址分配表 设备 接口 IPv6 地址 OSPF 区域 RA G0/0 2001:DB8:1:A1::1/64 1 G0/1 2001:DB8:1:A2::1/64 1 S0/0/0 2001:DB8:1:AB::2/64 0 本地链路 FE80::A 不适用 RB G0/0 2001:DB8:1:B1::1/64 0 S0/0/0 2001:DB8:1:AB::1/64 0 S0/0/1 2001:DB8:1:BC:…

JVM运行时数据区域之PCRegister和虚拟机栈

运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据 区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启 动而一直存在&#xff0c;有些区域则是依赖用户线程的启动和结束而建立…

群晖NAS搭建WebDav服务,并内网穿透实现公网访问

WebDAV是基于HTTP协议的通信协议。适用于有些客户限制于其他协议&#xff0c;要求使用WebDAV协议进行数据传输的&#xff0c;下面是通过WebDAV协议来访问群晖NAS的设置教程。 1. 在群晖套件中心安装WebDav Server套件 点击打开套件中心&#xff0c;并搜索webdav&#xff0c;点…

性能测试-linux-top/vmstat/dstat命令,闭着眼睛也要背出来

目录 Linux系统差异化 Ubuntu安装应用 CentOS安装应用 Linux通用安装&#xff0c;tar.gz包 Linux系统帮助命令 help/man/info Linux系统中树状结构查看文件 Linux系统中文件类型区分与权限 Linux系统中都有哪些文件夹及其作用 Linux性能测试分析-TOP命令(重点) Linu…

NFV关键技术:DPDK技术栈在网络云中的最佳实践

本文篇幅有限&#xff0c;很难用短短几语就勾勒出DPDK的完整轮廓&#xff0c;概括来说&#xff0c;DPDK是一个技术栈&#xff0c;主要用于Intel架构的服务器领域&#xff0c;其主要目的就是提升x86标准服务器的转发性能。因此&#xff0c;本文只重点介绍DPDK平台部分技术在电信…

基于stm32单片机智能温控风扇控制系统Proteus仿真

资料编号&#xff1a;103 下面是相关功能视频演示&#xff1a; 103-基于stm32单片机智能温控风扇控制系统Proteus仿真&#xff08;源码仿真全套资料&#xff09;功能介绍&#xff1a;采用stm32单片机、ds18b20温度传感器采集温度&#xff0c;通过判断当前的温度值是否超过预设…

程序员怎样才能写出一篇好的博客或者技术文章?

文章目录来分享下鹅厂多位技术同学关于如何写好技术文章的经验。**1 为什么要写文章****1.1 对作者的好处****1.1.1 复盘学习成果&#xff0c;巩固知识理解****1.1.2 提升思考能力****1.1.3 传播技术知识&#xff0c;积累技术资产****1.1.4 提升表达与总结能力****1.1.5 打造个…

尚医通 (二十五) --------- 医院接口开发

目录一、医院系统模拟接口1. 服务部署2. 操作说明3. 上传接口与回调接口① 业务术语② 安全控制③ 业务接口④ 平台接口⑤ 医院接口二、集成 MongoDB三、添加医院基础类四、上传医院五、参数签名六、图片 Base64 编码七、查询医院接口一、医院系统模拟接口 1. 服务部署 ① 找…

刷题笔记之十二(快到碗里来+跳台阶+变态跳台阶+不用加减乘除做加法+三角形+猴子分桃+反转部分单向链表)

目录 1. 快到碗里来 2. 跳台阶 3. 变态跳台阶 4. ConcurrentHashMap使用lock关键字保证线程安全;Arrays.asList返回值是List接口对象 5. 字符串对象比较相等,使用equals比较内容;使用 比较的是地址 6. 编译命令: javac 源文件名称.java; 运行命令: java 主类名称 要传递的…

第七章第二节:B树和B+树

文章目录教程&#xff1a;1. B树1.1 B树的定义1.2 B树的高度1.3 B树的插入和 删除1.4 B树的删除1.5 总结&#xff1a;2. B树2.1 B树的查找2.2 B树与B树的对比2.3 总结教程&#xff1a; B树&#xff1a; https://www.bilibili.com/video/BV1b7411N798/?p72&share_sourceco…

深入理解MySQL数据库(Innodb存储引擎)

1.BTree 什么是B Tree 1&#xff09;树中每个结点至多有M棵子树&#xff08;即至多含有m-1个关键字&#xff09; 2&#xff09;若根节点不是终端结点&#xff0c;则至少有两颗子树 3&#xff09;所有的叶子结点都出现在同一层次上&#xff0c;并且不带信息 什么是BTree …

【毕业设计】37-基于单片机智能楼宇消防监控系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)

【毕业设计】37-基于单片机智能楼宇消防监控系统设计&#xff08;原理图工程仿真工程源代码答辩论文答辩PPT&#xff09; 文章目录【毕业设计】37-基于单片机智能楼宇消防监控系统设计&#xff08;原理图工程仿真工程源代码答辩论文答辩PPT&#xff09;资料下载链接任务书设计说…

Redis集群(Cluster)

Redis集群(Cluster) 单台redis容量限制&#xff0c;如何进行扩容&#xff1f;继续加内存、加硬件么&#xff1f;单台redis并发写量太大有性能瓶颈&#xff0c;如何解决&#xff1f;redis3.0中提供了集群可以解决这些问题。 redis集群是对redis的水平扩容&#xff0c;即启动N个…

静态后台管理(9页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 |学生管理系统网页设计 | OA管理系统 | 后台管理模板 | 智能停车系统 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 H…

C++ Visual Studio 2022 中的改进、行为更改和错误修复

目录 Visual Studio 2022 版本 17.4 中的一致性改进 作用域的基础类型没有固定类型enum 定义中没有固定基础类型的枚举器类型enum Visual Studio 2022 版本 17.3 中的一致性改进 改进了指针之间的修饰符兼容性检查 Visual Studio 2022 版本 17.2 中的一致性改进 未终止的双向…

【分隔结构】定从分离

形式 先行词 其他定语 定语从句先行词 状语 定语从句作主语的先行词 谓语 定语从句 练习一 他们从一部分人来说&#xff0c;是受到了 1998 年才获得的 DNA 证据的启发&#xff0c;这份 DNA 证据&#xff0c;几乎肯定的证明了 Thomas Jefferson 和 他的奴隶 Sally Hemin…

力扣(LeetCode)16. 最接近的三数之和(C++)

双指针 快排使 numsnumsnums 正序。 设置三个指针 iii 指向 numsnumsnums 第一个数&#xff0c;从前往后枚举 nums[i]nums[i]nums[i] &#xff0c; lll 从 nums[i1]nums[i1]nums[i1] 往后&#xff0c;指向第二个数&#xff0c;rrr 从 nums.size()−1nums.size()-1nums.size()…

【博客539】使用openssl手动为k8s集群签发证书

使用openssl手动为k8s集群签发证书 创建ca私钥和ca证书 1、生成ca私钥&#xff1a;生成一个 2048 位的 ca.key 文件 openssl genrsa -out ca.key 2048 2、基于ca私钥&#xff0c;生成根(root)证书&#xff1a;在 ca.key 文件的基础上&#xff0c;生成 ca.crt 文件 openssl re…